使用levenstein编辑距离比较相似的字符串会遇到问题

时间:2013-02-01 17:10:40

标签: java string

我正在使用levenstein编辑距离来查找两个字符串的相似程度。这两个字符串就是这样。第一个是两个中的较长者,如果有的话;也是非截断的非修改字符串,我希望比较另一个。第二个字符串可能在末尾被截断,并且缺少字符。可以有多个唯一的字符串1和字符串twos。

我在第二个字符串列表中读到,每个字符串都包含在这种格式的行中 “[string two] - $ 0.00”所以它是字符串2加上空格,短划线,空格,然后是价格。

所以我有一个第二个字符串列表(格式),我有两个选项。删除价格和“ - ”或保持在那里。

  • 如果我删除它。我在每个字符串中读取两个并用分隔符“$”对其进行标记。我不知道任何字符串2有多长,所以我必须做一个stringtwo.removeAll(“ - ”)来摆脱破折号,然后是.trim()为空格。好吧,如果在第二个字符串中有一个破折号,它也将被非自愿删除。因此,我得到精确的字符串(levenstein = 0),截断但仍然是精确的字符串(字符串是相同的长度字符串1 - levenstein),截断并缺少整数量的破折号(字符串相同的几个地方之间破折号,如果截断也在末尾丢失),或者没有截断但缺少整数个破折号。

  • 如果我离开它。仍在每个字符串中读取两个并使用分隔符“$”进行标记。所以现在我有这种格式的字符串二“[string two] - ”。因此,所有levenstein距离都将减少3.这里的问题是如果我有一个字符串Ex。 “狗食是美味的”,我试图比较的两个字符串是“狗食是百胜 - ”levD = 3,但这是相同的levD,好像我有两个字符串“狗食是美味的 - ”。

正如您所看到的,两种选择都会产生问题。似乎我无法在我的程序中克服这些问题,尝试将字符串twos的输入列表与我的字符串列表匹配。

任何人都可以看到更好的方法吗?我可以使用其他任何字符串比较器来减轻问题吗?

1 个答案:

答案 0 :(得分:1)

试试这个:应该截断每个字符串中最后一个“ - ”的字符串,同时保持字符串的其余部分不变。

StringTwo.substring(0, StringTwo.lastIndexOf("-")).trim();

这些字符串操作可能很昂贵,因此如果您使用大量字符串,则可能会考虑其他优化。

此解决方案也很脆弱,因为它会对值进行硬编码以确定修剪代码的位置。这可以在别处定义并传入,因此可以有所不同。

一旦你有相对良好和安全的工作,接下来尝试从Apache中查看具有更广泛的字符串操作的StringUtils。

org.apache.commons.lang.StringUtils from Apache Commons Lang