自然语言处理(NLP)世界里的Word Embeddings小课堂(word2vec,BoW,FastText...)

261 阅读2分钟

什么是word representation?

在正常的人类语言中,每个词语都有他对应的意思,在人类的世界里,我们有各种各样的词典来给词语记录定义,便于我们理解与查找。那么对于机器来说,他们是怎么表达并且记录各个词语的呢?普林斯顿大学推出的Wordnet,便是一个解决办法。WordNet是一个庞大的英语词汇数据库,各个不同类型的词,例如:名词,动词,形容词和副词被分组为认知同义词集(synset),每个词都有自己的synset list 和对应的上义词 (hypernyms) 同义词通过概念语义 (conceptual-semantic)和词汇关系 (lexical relations)相互关联。由此,你可以调用nltk里wordnet的包,来寻找词汇的同义词集和上义词。

利用wordnet寻找“good”的同义词集:

import nltk
nltk.download('wordnet')
from nltk.corpus import wordnet as wn

poses = {'n':'noun','v':'verb','s':'adj (s)','a':'adj','r':'adv'}

for synset in wn.synsets("happy"):
  print("{}:  {}".format(poses[synset.pos()],", ".join([lemma.name() for lemma in synset.lemmas()])))

获得结果:

[nltk_data] Downloading package wordnet to /root/nltk_data...
[nltk_data]   Package wordnet is already up-to-date!
adj:  happy
adj (s):  felicitous, happy
adj (s):  glad, happy
adj (s):  happy, well-chosen

利用wordnet寻找“cat”的上义词:

from nltk.corpus import wordnet as wn
cat = wn.synset("cat.n.01")
hyper = lambda s: s.hypernyms()
list(cat.closure(hyper))

获得结果:

[Synset('feline.n.01'),
 Synset('carnivore.n.01'),
 Synset('placental.n.01'),
 Synset('mammal.n.01'),
 Synset('vertebrate.n.01'),
 Synset('chordate.n.01'),
 Synset('animal.n.01'),
 Synset('organism.n.01'),
 Synset('living_thing.n.01'),
 Synset('whole.n.02'),
 Synset('object.n.01'),
 Synset('physical_entity.n.01'),
 Synset('entity.n.01')]

wordnet这类语料库的问题

wordnet就像人类的词典一样,是一个很好的语料库。但是他的缺点也像我们人类的字典一样显而易见,当我们出现新词汇时,wordnet并没有办法即使把它收录进自己的词汇库里。由此,如果想要像wordnet这样的语料库一直跟上时代的潮流,大量的人工录入在所难免,这也是现在很多语料库的通病。同时,通过上面两个例子你也可以发现,wordnet缺失了机器学习语言很重要的一部分,那就是两个词语之间的相似度。wordnet并没有提供任何给予机器学习两个词语的相似度的机会,这也是它很大的一个不足。