使用已知算法比较两个字符串

时间:2013-08-23 09:46:46

标签: java string algorithm compare

我正在尝试使用一些众所周知的算法(如Levenstein distance)和string simmetrics的不同解决方案库来比较两个字符串(产品名称)(使用 SmithWatermanGotoh alg)。

两个字符串是:

  

iPhone 3gs 32 GB黑色

     

Apple iPhone 3 gs 16GB黑色

如果某些单词的顺序不同(可以从算法的工作方式来看),Levenstein在整个字符串上的工作非常糟糕,所以我尝试逐字实现。

我面临的问题是如何检测用空格字符分隔的类似“单词”(' 3gs ' - >' 3 gs ' ;' 32 GB ' - >' 16GB ')。

我的代码将较短的(字数,if == then str.length)字符串与较长的字符串进行比较。单词分为ArrayList<String>。我将str1中的每个单词与同一个字符串中的其他单词组合在一起,创建了新的arraylist。

这是一个粗略的代码:

foreach(str1)

    foreach(str2)
        res1 = getLevensteinDist
    endforeach

    foreach(combinedstr2)
        res1 = getLevensteinDist
    endforeach      

    return getHigherPercent(res1, res2)

 endforeach

如果str2中的单词被分割,这是有效的,但是我无法弄清楚如何进行反向,检测str2中以str1分割的单词。

我希望我至少有点清楚自己要做什么。感谢每一位帮助。

4 个答案:

答案 0 :(得分:1)

首先你应该预处理你的字符串,我的意思是你应该从输入字符串中删除“a,the,as,an”和所有常见的动词,numnbers,...你也应该将每个复数形式转换为单数形式形式,......统一所有的话。然后你可以应用一些字符串匹配算法,或者只是将这些单词放入hashmap中,或者如果它们很多,将它们放入trie中,然后运行你的相似度算法。

答案 1 :(得分:0)

看看TF-IDF。它专门用于计算文本特征之间的相似性。

http://nlp.stanford.edu/IR-book/html/htmledition/tf-idf-weighting-1.html

答案 2 :(得分:0)

尝试将其中一个字符串拆分为单词,然后将eash单词运行SmithWaterman并使用SmithWaterman的分数作为相似性度量。

答案 3 :(得分:0)

13年前我编写了自己的三元模糊搜索算法, 命名为“Wilbur-Khovayko算法”。

您可以在此处下载:http://olegh.cc.st/wilbur-khovayko.tar.gz

为输入的搜索字词搜索“N个最近的字词”。

术语列表 - 在文件termlist.txt中 N - 在变量lim中,文件findtest.c

Alrorithm非常快:在旧太阳200mHz上,它搜索100个最近的100个星期 条目约0.3秒。