如何计算WordNet中没有出现的英文单词的相似度?

时间:2016-07-08 19:06:56

标签: python nltk similarity

一种特殊的自然语言实践是使用WordNet计算两个单词之间的相似性。我用以下python代码开始我的问题:

from nltk.corpus import wordnet
sport = wordnet.synsets("sport")[0]
badminton = wordnet.synsets("badminton")[0]
print(sport.wup_similarity(badminton))

我们将获得0.8421

现在如果我寻找"哈哈"和" lol"如下:

haha = wordnet.synsets("haha")
lol = wordnet.synsets("lol")
print(haha)
print(lol)

我们会得到

[]
[]

然后我们不能考虑它们之间的相似性。在这种情况下我们能做些什么?

4 个答案:

答案 0 :(得分:6)

您可以使用 Dissect (DIStributional SEmantics Composition Toolkit)等工具从共生矩阵创建语义空间 然后你将设置测量单词或短语之间的语义相似性(如果你组成单词)。

ha lol 的情况下,您需要收集这些同谋。

另一件要尝试的事情是word2vec。

答案 1 :(得分:5)

有两种可能的其他方式:

CBOW:连续的词汇

跳过克模型:此模型与CBOW模型相反

看看这个:https://www.quora.com/What-are-the-continuous-bag-of-words-and-skip-gram-architectures-in-laymans-terms

这些模型在这里很受欢迎:https://www.tensorflow.org/tutorials/word2vecGENSIM也是一个很好的python库来做这些事情

尝试寻找Tensorflow解决方案,例如:https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/word2vec/word2vec_basic.py

或尝试寻找word2vec:https://en.wikipedia.org/wiki/Word2vec

答案 2 :(得分:2)

有不同的测量相似度的模型,例如word2vec或手套,但你似乎更多地寻找包含社交,非正式短语的语料库,例如“lol'”。

但是,我要提出word2vec,因为它会导致我认为是你问题的答案。

word2vec(以及其他单词嵌入模型,如手套)的基本概念是向量空间中的单词表示,其中包含单词之间的关系。这非常适合测量相似性,因为矢量有很多已建立的数学可供绘制。您可以在原paper,中详细了解word2vec的技术细节,但我非常喜欢this blog post,因为它写得很好而且简洁。

同样,由于word2vec只是一个模型,你需要将它与正确的训练集配对以获得你所寻求的那种范围。在网络上有一些预先训练好的模型,例如this bunch.训练集实际上是允许您查询更多种类的术语而不是模型。

如果他们有像你一直寻求的社交短语,你当然可以使用那些预先训练过的模型。但是,如果您没有看到已经在合适的语料库中训练过的模型,您可以自己轻松地训练模型。我建议使用Twitter或维基百科的语料库(训练集),以及gensim中word2vec作为单词嵌入模型的实现。

答案 3 :(得分:2)

您可以使用其他框架。我也尝试了NLTK,但终于登陆了spacy(spacy.io)非常快速和功能的框架。有一种称为“相似性”的单词的方法,它可以用于其他单词(但它也适用于句子,文档等)。它是使用word2vec实现的。实际上我不知道他们的词汇量有多大,以及如果这个词不为人知,它会如何挣扎但是值得尝试。

我也在玩这个: https://radimrehurek.com/gensim/models/word2vec.html 你可以在2行中加载google的大word2vec模型(这个项目将google word2vec c ++库移植到python中),可在此处访问: https://docs.google.com/file/d/0B7XkCwpI5KDYaDBDQm1tZGNDRHc/edit