问题 我怎样才能为类似的单词进行搜索匹配


我正在努力尝试自动分类短文,我正在试图弄清楚如何匹配相似的单词 - 例如,货架,绘画和重绘

我正在使用Porter词干分析算法,但它只对某些情况有帮助,并且只对单词的结尾有用(上面的两个例子都不适用)。

是否有一个算法或相关的单词列表可以帮助这样的事情(除了自己做?)

(我正在使用php,因此使用该语言的任何解决方案都会更有帮助。)


6488
2017-10-31 16:53


起源



答案:


Levenshtein距离 是你在找什么。

对于任何两个字符串,它计算将一个字符串更改为另一个字符串所需的最小插入次数,突变次数和删除次数。

如果距离较低,那么这两个词是相似的。

你也可以使用 探测法 算法判断两个单词听起来是否相似。

也可以看看:
PHP levenshtein函数
PHP soundex函数


11
2017-10-31 16:56



Levenshtein在这种背景下的一个特殊问题是你必须找到一个好的门槛;它只返回两个单词之间的变化次数。原帖中的两个例子有很多不同之处:levenshtein(“shelf”,“shelf”)= 3,levenshtein(“绘画”,“重绘”)= 5。 - Jan Krüger
供参考 - 我发现了 stackoverflow.com/questions/634995/... 其中包含一些mysql存储过程版本的链接。虽然正如Jan指出的那样,目前尚不清楚它会有多接近。但值得一试。 - Yehosef
这是最接近的答案 - 它不是理想的,但是一个良好的开端。 jan的单词列表更理想,但在这一点上并不实用。 - Yehosef


答案:


Levenshtein距离 是你在找什么。

对于任何两个字符串,它计算将一个字符串更改为另一个字符串所需的最小插入次数,突变次数和删除次数。

如果距离较低,那么这两个词是相似的。

你也可以使用 探测法 算法判断两个单词听起来是否相似。

也可以看看:
PHP levenshtein函数
PHP soundex函数


11
2017-10-31 16:56



Levenshtein在这种背景下的一个特殊问题是你必须找到一个好的门槛;它只返回两个单词之间的变化次数。原帖中的两个例子有很多不同之处:levenshtein(“shelf”,“shelf”)= 3,levenshtein(“绘画”,“重绘”)= 5。 - Jan Krüger
供参考 - 我发现了 stackoverflow.com/questions/634995/... 其中包含一些mysql存储过程版本的链接。虽然正如Jan指出的那样,目前尚不清楚它会有多接近。但值得一试。 - Yehosef
这是最接近的答案 - 它不是理想的,但是一个良好的开端。 jan的单词列表更理想,但在这一点上并不实用。 - Yehosef


好吧,有所有“相关单词列表”的母亲,称为WordNet: http://wordnet.princeton.edu/

它是免费提供的,需要相当慷慨的许可证。 “相关项目”部分中有一个PHP接口。

这相对于使用单词相似度算法的优点在于它甚至知道诸如“绘画”和“颜色”之类的单词的不同同义词。缺点是你要么必须知道正确的同义词(毕竟,一个词可能意味着不同的东西),或者你可以获得一个非常疯狂的同义词列表。


4
2017-10-31 16:59



哇 - 谢谢你的链接。我认为只是理解数据库格式比我对项目更多的时间,但它似乎是理想的方式。 - Yehosef