NLTK或spaCy,如何高效总结NLP程序包使用技巧?
摘要:NLTK和SpaCy是NLP的Python应用,提供了一些现成的处理工具和数据接口。下面介绍它们的一些常用功能和特性,便于对NLP研究的组成形式有一个基本的了解。 NLTK Natural Language Toolkit (NLTK) 由
NLTK和SpaCy是NLP的Python应用,提供了一些现成的处理工具和数据接口。下面介绍它们的一些常用功能和特性,便于对NLP研究的组成形式有一个基本的了解。
NLTK
Natural Language Toolkit (NLTK) 由宾夕法尼亚大学开发,提供了超过50种语料库,以及一些常用的文本处理函数,例如分词(Tokenization)、词干(Stemming)、词性标记(Tagging)等。
下面主要介绍WordNet语料库,其它方法和接口等用到了再进行记录。
WordNet
在WordNet中,每个词由于可以有多重词义,因此会被包含在多个同义词集中。每个同义词集中又包含多个这个意思下的所有词汇(Lemma, 词元)。WordNet还对所有词义(动词和名词)进行了包含与被包含关系的层次排序。因此词义之间得以组成一种树状结构。此外,WordNet还包含量化两个词之间相似度的方法。
同义词集
同义词集用三元组表示,如下展示了channel被包含的所有同义词集:
import nltk
from nltk.corpus import wordnet
a = wordnet.synsets('channel')
print(a)
如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())
其中同义词下的词元用四元组表示。
反义词
由于一个词有多种意思,因此获取反义词需要通过四元组词元(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())
上下位词
根据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") # 到根节点的路径
我们可以画出树形结构示意图如下:
词之间的相似度
利用层次关系,WordNet可以计算名词、动词之间的相似性。
