张芷铭的个人博客

NLTK

NLTK(Natural Language Toolkit)是 Python 自然语言处理库,提供分词、词性标注、句法分析等工具。

官网:https://www.nltk.org/

核心功能

功能说明
分词将文本切分为单词或句子
词性标注为单词分配词性标签
词干提取还原词汇到词干(Porter 算法)
词形还原还原词汇到标准词形(WordNet)
句法分析基于 CFG 分析句子结构
语义分析查找同义词、反义词等

分词(Tokenization)

1
2
3
from nltk.tokenize import word_tokenize
tokens = word_tokenize("NLTK is great for text analysis.")
# ['NLTK', 'is', 'great', 'for', 'text', 'analysis', '.']

词性标注(POS Tagging)

1
2
3
from nltk import pos_tag
tagged = pos_tag(tokens)
# [('NLTK', 'NNP'), ('is', 'VBZ'), ...]

词干提取 vs 词形还原

1
2
3
4
5
6
7
8
9
from nltk.stem import PorterStemmer, WordNetLemmatizer

# 词干提取(规则截断)
stemmer = PorterStemmer()
stemmer.stem("running")  # 'run'

# 词形还原(词典查找,更准确)
lemmatizer = WordNetLemmatizer()
lemmatizer.lemmatize("running", pos='v')  # 'run'

句法分析

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
from nltk import CFG, ChartParser

grammar = CFG.fromstring("""
S -> NP VP
NP -> Det N
VP -> V NP
Det -> 'the' | 'a'
N -> 'dog' | 'cat'
V -> 'chased'
""")

parser = ChartParser(grammar)
for tree in parser.parse(['the', 'dog', 'chased', 'a', 'cat']):
    tree.pretty_print()

语义分析(WordNet)

1
2
3
4
from nltk.corpus import wordnet

for syn in wordnet.synsets("dog"):
    print(syn.name(), syn.definition())

文本分类

1
2
3
4
5
6
7
from nltk.classify import NaiveBayesClassifier

def extract_features(words):
    return {word: True for word in words}

classifier = NaiveBayesClassifier.train(train_data)
classifier.classify(extract_features("Great movie!".split()))

原理总结

  1. 预处理:分词、标注、词形还原
  2. 方法:规则 + 统计模型结合
  3. 分类:Naive Bayes、Decision Tree
  4. 资源:WordNet、Treebank 内置

Comments