我正在使用nltk的wordnet API.当我将一个synset与另一个synset进行比较时,我得到了None但是当我比较它们时,我得到一个浮点值.
他们不应该给出相同的价值吗?有解释还是这是wordnet的错误?
例:
wn.synset('car.n.01').path_similarity(wn.synset('automobile.v.01')) # None
wn.synset('automobile.v.01').path_similarity(wn.synset('car.n.01')) # 0.06666666666666667
Run Code Online (Sandbox Code Playgroud) 我有一系列句子,我需要分析它们,看看它们有多相似.
有没有建立的算法来做到这一点?
我很在乎:
我之前使用Levenshtein距离和n-gram进行拼写,虽然我不完全相信这些是否符合我的目的.
天真地说,"我不关心拼写差异,拼写错误可以被视为不同的词语",尽管考虑到这一点可能会很好.
也许在空间分割句子和上述(或其他)算法之一的混合可能是一个起点
有哪些选择?有什么建议?
谢谢!
我想找出两个网页是否相似.有人可以建议如果python nltk与wordnet相似性功能有用,如何?在这种情况下使用的最佳相似度函数是什么?
我想知道我是否可以将它们解除为正常状态?
问题是我有成千上万的不同形式的单词,例如吃,吃,吃,吃等等,我需要计算每个单词的频率.所有这些 - 吃,吃,吃,吃等都会计入吃,因此,我使用了茎.
但问题的下一部分要求我在数据中找到相似的单词,我使用nltk的同义词来计算单词中的Wu-Palmer相似度.问题是nltk的同义词不会对词干词起作用,或者至少在这段代码中它们不会.检查两个单词是否相互关联
我该怎么办?有没有办法解除一个字?
我的项目中有一个用例,我需要将key-string 与很多字符串进行相似性比较。如果这个值大于某个阈值,我认为这些字符串与我的“相似” key,并根据该列表,我进行一些进一步的计算/处理。
我一直在探索模糊匹配字符串相似性的东西,它使用edit distance基于“levenshtein、jaro 和 jaro-winkler”相似性的算法。
尽管它们工作得很好,但如果一个字符串是另一个字符串的“缩写”,我希望获得更高的相似度分数。有没有我可以使用的算法/实现。
笔记:
language: python3
packages explored: fuzzywuzzy, jaro-winkler
Run Code Online (Sandbox Code Playgroud)
例子:
using jaro_winkler similarity:
>>> jaro.jaro_winkler_metric("wtw", "willis tower watson")
0.7473684210526316
>>> jaro.jaro_winkler_metric("wtw", "willistowerwatson")
0.7529411764705883
using levenshtein similarity:
>>> fuzz.ratio("wtw", "willis tower watson")
27
>>> fuzz.ratio("wtw", "willistowerwatson")
30
>>> fuzz.partial_ratio("wtw", "willistowerwatson")
67
>>> fuzz.QRatio("wtw", "willistowerwatson")
30
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如果可能的话,我希望分数更高(>90%)。我也可以接受很少的误报,因为它们不会对我的进一步计算造成太多问题。但是,如果我们匹配 s1 和 s2,使得 s1 完全包含在 s2 中(反之亦然),那么它们的相似度得分应该会高得多。
对我来说,空格是多余的。这意味着,wtw被视为“willistowerwatson”和“willis tower watson”的缩写。
另外,stove是“STack OVERflow”或“STandardOVErview”的有效缩写
一种简单的算法是从较小字符串的第一个字符开始,看看它是否存在于较大字符串中。然后检查第二个字符,依此类推,直到条件满足第一个字符串完全包含在第二个字符串中。这对我来说是 100% 匹配。
诸如“willistowerwatson”之类的进一步示例wtwx可以给出例如 80% …
我试图比较那些与语义相关的术语/表达 - 这些不是完整的句子,也不一定是单个单词; 例如 -
"社交网络服务"和"社交网络"显然密切相关,但如何使用nltk对此进行量化?
显然我甚至错过了代码:
w1 = wordnet.synsets('social network')
Run Code Online (Sandbox Code Playgroud)
返回一个空列表.
关于如何解决这个问题的任何建议?
使用几种内置的相似性度量可以轻松地计算WordNet中两个同义词集之间的语义相似性,例如:
synset1.path_similarity(synset2)
Run Code Online (Sandbox Code Playgroud)
synset1.lch_similarity(synset2),Leacock-Chodorow相似度
synset1.wup_similarity(synset2),吴帕尔默相似
然而,所有这些都利用了WordNet的分类关系,这些关系是名词和动词的关系.形容词和副词通过同义词,反义词和属性相关联.如何衡量两个形容词之间的距离(跳数)?
我尝试过path_similarity(),但正如预期的那样,它会返回'None':
from nltk.corpus import wordnet as wn
x = wn.synset('good.a.01')
y = wn.synset('bad.a.01')
print(wn.path_similarity(x,y))
Run Code Online (Sandbox Code Playgroud)
如果有任何方法来计算一个形容词与另一个形容词之间的距离,那么指出它将会非常感激.