[英]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 时,这些词不必具有任何含义。 例如,字符串abcd
和abed
MED = 1
。 但它们在语言中没有真正的意义。
语义距离:这是衡量单词在意义方面相距多远的指标。 因此,您在这里需要一个词汇表,在此基础上构建模型。 在这里,单词被转换为表示其相对含义的数字向量。 例如,代表tree
和wood
向量将比代表king
和queen
向量更接近。 可以使用Word2Vec
等常用模型或BERT
或GPT-2
等高端神经网络获得单词的向量表示。 矢量表示之间的余弦距离是一种语义距离。 另一种语义距离是欧氏距离。
注意:在语义表示的情况下,所有与词汇表中任何单词都不匹配的单词(例如kamra
、 abcxyz
)都将归为一种含义,代表 {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.