繁体   English   中英

找到单词之间的余弦相似度

[英]find cosine similarity between words

是否有可能找到两个词之间的相似性? 例如:

cos_lib = cosine_similarity('kamra', 'cameras')

这给了我一个错误

ValueError: could not convert string to float: 'kamra'

因为我还没有将单词转换为数值向量。 我怎么能这样做? 我试过这个,但它也不起作用:

('kamra').toarray()

我的目标是检查与字典的两个值(列表)的相似性,并返回具有最高相似性的键。 那可能吗?

features = {"CAMERA": ['camera', 'kamras'], "BATTERY": ['batterie', 'battery']}

我也试过这个,但我对结果不满意:

print(damerau.distance('dual camera', 'cameras'))
print(damerau.distance('kamra', 'battery'))

因为结果是 6 和 5。但是前两个字符串之间的相似度更大,所以距离应该更小。 这就是我正在努力实现的目标。

余弦距离总是定义在两个相同长度的实向量之间。

对于单词/句子/字符串,有两种距离:

最小编辑距离:这是使两个单词具有相同字符所需的更改次数。 定义 MED 时,这些词不必具有任何含义。 例如,字符串abcdabed MED = 1 但它们在语言中没有真正的意义。

语义距离:这是衡量单词在意义方面相距多远的指标。 因此,您在这里需要一个词汇表,在此基础上构建模型。 在这里,单词被转换为表示其相对含义的数字向量。 例如,代表treewood向量将比代表kingqueen向量更接近。 可以使用Word2Vec等常用模型或BERTGPT-2等高端神经网络获得单词的向量表示。 矢量表示之间的余弦距离是一种语义距离。 另一种语义距离是欧氏距离。

注意:在语义表示的情况下,所有与词汇表中任何单词都不匹配的单词(例如kamraabcxyz )都将归为一种含义,代表 {unknown word}。

对于您的特定用例,我建议运行 MED 从词汇表中获取最可能的单词,然后是某种形式的语义距离。 您可以为前者尝试一些自动更正 API。

我建议使用来自Gensim的预训练模型。 你可以下载一个预先训练好的模型,然后得到它们两个向量之间的余弦相似度。

import gensim.downloader as api
# overview of all models in gensim: https://github.com/RaRe-Technologies/gensim-data
model_glove = api.load("glove-wiki-gigaword-100")

model_glove.relative_cosine_similarity("politics", "vote")
# output: 0.07345439049627836
model_glove.relative_cosine_similarity("film", "camera")
# output: 0.06281138757741007
model_glove.relative_cosine_similarity("economy", "fart")
# output: -0.01170896437873441

但是,预训练模型将很难识别错别字,因为它们可能不在训练数据中。 弄清楚这些是与余弦相似度不同的任务。

model_glove.relative_cosine_similarity("kamra", "cameras")
# output: -0.040658474068872255

但是,如果您有多个单词并且希望从列表中找到最相似的单词,则以下函数可能会很有用:

model_glove.most_similar_to_given("camera", ["kamra", "movie", "politics", "umbrella", "beach"])
# output: 'movie'

幸运的是,有一些库可以做到这一点,例如word2vec 您需要在一些数据语料库上对其进行训练或下载预训练模型(针对您的特定语言或语言集)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM