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程序包使用总结

文章插图
词之间的相似度利用层次关系,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')
NLTK/spaCy 自然语言处理NLP程序包使用总结

文章插图
以上分别计算了路径相似度、Wu-Palmer相似度和LCH相似度 。可以看出,两个词集所属的共同最深上位词集越深 , 它们的共同含义越具体 , Wup-Palmer相似度越大 。另外,经过测试,发现动词集与名词集分别属于不同的树 , 因此它们之间无法计算相似性 。

推荐阅读