NLTK/spaCy 自然语言处理NLP程序包使用总结

NLTK和SpaCy是NLP的Python应用 , 提供了一些现成的处理工具和数据接口 。下面介绍它们的一些常用功能和特性 , 便于对NLP研究的组成形式有一个基本的了解 。
NLTKNatural Language Toolkit (NLTK) 由宾夕法尼亚大学开发 , 提供了超过50种语料库 , 以及一些常用的文本处理函数 , 例如分词(Tokenization)、词干(Stemming)、词性标记(Tagging)等 。
下面主要介绍WordNet语料库 , 其它方法和接口等用到了再进行记录 。
WordNet在WordNet中 , 每个词由于可以有多重词义 , 因此会被包含在多个同义词集中 。每个同义词集中又包含多个这个意思下的所有词汇(Lemma, 词元) 。WordNet还对所有词义(动词和名词)进行了包含与被包含关系的层次排序 。因此词义之间得以组成一种树状结构 。此外 , WordNet还包含量化两个词之间相似度的方法 。
同义词集同义词集用三元组表示 , 如下展示了channel被包含的所有同义词集:
import nltkfrom nltk.corpus import wordneta = wordnet.synsets('channel')print(a)

NLTK/spaCy 自然语言处理NLP程序包使用总结

文章插图
如channel.n.01表示channel的第一个名词词义 。此外channel还有impart.v.03词义 , 表示impart的第三个动词词义 。我们可以看同义词集的解释、例子和这个同义词下的所有词元:
a = wordnet.synsets('channel')[0] #获取一个同义词集 , # a = wordnet.synset('channel.n.01') # 或直接用 wordnet.synset('channel.n.01')print(a.definition())print(a.examples())print(a.lemmas())
NLTK/spaCy 自然语言处理NLP程序包使用总结

文章插图
其中同义词下的词元用四元组表示 。
反义词由于一个词有多种意思 , 因此获取反义词需要通过四元组词元(lemma) 。
synset1 = wordnet.synsets('good')[1]lemma1 = synset1.lemmas()[0]print("Lemma 1: ", lemma1)print("Meaning 1: ", synset1.definition())lemma2 = lemma1.antonyms()[0]synset2 = lemma2.synset()print("Lemma 2: ", lemma2)print("Meaning 2: ", synset2.definition())
NLTK/spaCy 自然语言处理NLP程序包使用总结

文章插图
上下位词根据WordNet的树状结构可以获取某个词集的上下位词集 , 及其对应的根节点、到根节点的路径 。当然只对名词和动词有效 , 形容词和副词没有上下级的类别层次关系 。
syn = wordnet.synsets('knife')[0] #获取某个同义词集print("Upper: ", syn.hypernyms(), end="\n\n") # 上位词print("Lower: ", syn.hyponyms(), end="\n\n") # 下位词print("Root: ", syn.root_hypernyms(), end="\n\n") # 根节点print("Path: ", syn.hypernym_paths(), end="\n\n") # 到根节点的路径
NLTK/spaCy 自然语言处理NLP程序包使用总结

文章插图
我们可以画出树形结构示意图如下:
【NLTK/spaCy 自然语言处理NLP程序包使用总结】
NLTK/spaCy 自然语言处理NLP程序包使用总结

文章插图
词之间的相似度利用层次关系 , WordNet可以计算名词、动词之间的相似性 。
def similarity_with_upper(syn):  a = wordnet.synset(syn)  b = wordnet.synset(syn).hypernyms()[0]  print("Distance: ", a.shortest_path_distance(b)) # 两个同义词集之间的距离  print("Path similarity: ", a.path_similarity(b)) # 路径相似度 , 由两个词集之间的距离决定  print("Distance to root: ", b.hypernym_paths()[0].__len__()) # 到根节点的路径  print("Wup-Palmer similarity: ", a.wup_similarity(b)) # Wu-Palmer相似度 , 由两个词集所属的共同最深上位词集的深度决定  print("LCH similarity: ", a.lch_similarity(b))  # LCH相似度 , 由以上两个指标决定  print()similarity_with_upper('human.n.01')similarity_with_upper('animal.n.01')

经验总结扩展阅读