我正在尝试使用一些众所周知的算法(如Levenstein distance)和string simmetrics的不同解决方案库来比较两个字符串(产品名称)(使用 SmithWatermanGotoh alg)。
两个字符串是:
如果某些单词的顺序不同(可以从算法的工作方式来看),Levenstein在整个字符串上的工作非常糟糕,所以我尝试逐字实现。iPhone 3gs 32 GB黑色
Apple iPhone 3 gs 16GB黑色
我面临的问题是如何检测用空格字符分隔的类似“单词”(' 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分割的单词。
我希望我至少有点清楚自己要做什么。感谢每一位帮助。
答案 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)
您可以在此处下载:http://olegh.cc.st/wilbur-khovayko.tar.gz
为输入的搜索字词搜索“N个最近的字词”。
术语列表 - 在文件termlist.txt中 N - 在变量lim中,文件findtest.c
Alrorithm非常快:在旧太阳200mHz上,它搜索100个最近的100个星期 条目约0.3秒。