0

什么是最简单的方法,用最少的代码来比较两个字符串,同时忽略以下内容:

"hello  world" == "hello world"                   // spaces
"hello-world"  == "hello world"                   // hyphens
"Hello World"  == "hello worlD"                   // case
"St pierre"    == "saint pierre" == "St. Pierre"  // word replacement

我敢肯定这以前已经做过,并且有一些图书馆可以做这种事情,但我不知道。最好用 C++ 编写,但如果有任何其他语言的简短选项,我也想听听。

或者,我也对任何可以提供匹配百分比的库感兴趣。说,hello-world并且hello wolrd有 97% 的可能性是相同的意思,只是一个连字符和一个拼写错误。

4

5 回答 5

2
于 2013-05-08T17:19:12.730 回答
1

我不知道任何库,但为了平等,如果速度不是问题,您可以逐个字符比较并忽略“特殊”字符(分别在文本中进一步移动迭代器)。

至于比较文本,您可以使用简单的Levenshtein distance

于 2013-05-08T17:10:13.590 回答
1

对于空格和连字符,只需替换字符串中的所有空格/连字符并进行比较。对于大小写,将所有文本转换为大写或小写并进行比较。对于单词替换,您需要一个单词字典,其中键是缩写词,值是替换词。您也可以考虑使用Levenshtein 距离算法来显示一个短语与另一个短语的相似程度。如果您想要一个单词/短语与另一个单词/短语的接近程度的统计概率,您将需要样本数据来进行比较。

于 2013-05-08T17:10:17.947 回答
0

QRegExp就是你要找的。它不会打印出百分比,但是您可以使用一些非常巧妙的方法来比较一个字符串与另一个字符串,并找出一个字符串与另一个字符串的匹配数。

几乎所有语言都可以使用正则表达式。我喜欢GSkinner 的 RegEx页面,用于学习正则表达式。

http://qt-project.org/doc/qt-4.8/qregexp.html

希望有帮助。

于 2013-05-08T17:08:51.240 回答
0

对于前 3 个要求,

  1. 删除字符串的所有空格/连字符(或将其替换为字符,例如' ')“hello world”->“hello world”
  2. 比较它们忽略大小写。 C ++中不区分大小写的字符串比较

对于最后一个要求,它更符合要求。
首先你需要一个字典,它在 KV 结构中:
'St.': 'saint'
'Mr.': 'mister'

第二次使用 boost token 来分隔字符串,然后在 KV Store 中获取然后
将 token 替换为字符串,但它可能性能低下:

http://www.boost.org/doc/libs/1_53_0/libs/tokenizer/tokenizer.htm

于 2013-05-08T17:12:00.770 回答