【问题标题】:how could I make a search match for similar words我怎样才能对相似的词进行搜索匹配
【发布时间】:2011-05-03 02:50:22
【问题描述】:

我正在尝试自动对短篇文章进行分类,并且我正在尝试找出如何匹配相似的词 - 例如,货架或绘画和重绘

我使用的是 Porter 词干算法,但它只在某些情况下有帮助,而且只在词尾有帮助(上面的两个例子都不适用于它)。

是否有算法或相关的单词列表可以帮助解决这样的问题(除了我自己做的?)

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

【问题讨论】:

    标签: algorithm search


    【解决方案1】:

    Levenshtein Distance 是您正在寻找的。​​p>

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

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

    您还可以使用Soundex 算法来确定两个单词是否听起来相似。

    另请参阅:
    PHP levenshtein function
    PHP soundex function

    【讨论】:

    • Levenshtein 在这种情况下的一个特殊问题是你必须找到一个好的阈值;它只返回两个单词之间的变化次数。原帖中的两个例子有很大的不同:levenshtein("shelf", "shelves") = 3, levenshtein("painting", "repaint") = 5。
    • 供参考 - 我找到了stackoverflow.com/questions/634995/…,其中包含指向某个 mysql 存储过程版本的链接。尽管正如 Jan 指出的那样,目前还不清楚它会有多近。但值得一试。
    • 这是最接近的答案 - 这并不理想,但它是一个好的开始。来自 jan 的单词列表更理想,但目前还没有那么实用。
    【解决方案2】:

    嗯,有所有“相关词表”之母,叫做 WordNet:http://wordnet.princeton.edu/

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

    与使用单词相似度算法相比,它的优势在于它甚至可以识别单词的不同同义词,例如“paint”和“color”。缺点是你要么必须知道正确的同义词集(毕竟,一个词可能意味着不同的东西),要么你可以得到一个相当疯狂的同义词列表。

    【讨论】:

    • 哇-感谢您的链接。我认为仅仅了解 db 格式会比我在项目上花费的时间更多,但这似乎是理想的方式。
    猜你喜欢
    • 2023-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-26
    • 2017-02-25
    • 2021-09-17
    • 1970-01-01
    • 2021-05-25
    相关资源
    最近更新 更多