【发布时间】:2013-02-24 13:35:26
【问题描述】:
我需要比较字符串以确定它们是否代表相同的事物。这与人类输入的案例标题有关,其中缩写和其他小细节可能有所不同。例如,考虑以下两个标题:
std::string first = "Henry C. Harper v. The Law Offices of Huey & Luey, LLP";
相对于:
std::string second = "Harper v. The Law Offices of Huey & Luey, LLP";
人类可以快速判断这些很可能是相同的。我目前采用的方法是通过将所有字母小写并删除所有标点符号和空格来规范化字符串:
std::string firstNormalized = "henrycharpervthelawofficesofhueylueyllp";
还有:
std::string secondNormalized = "harpervthelawofficesofhueylueyllp";
在这种情况下比较,一个是另一个的子序列,但您可以想象其他更复杂的变体,其中不一定会发生这种情况,但它们具有重要的共同子序列。偶尔也可能出现人为输入错误,例如转置字母和拼写错误。
也许某种字符差异程序可以提供帮助?我已经看到了用于比较要签入的代码差异的良好行差异程序,是否有类似的基于字符的东西,也许是在 boost 中?如果您可以计算共同的连续字符的数量并取非共享字符的比率,也许这将是一个很好的启发式方法?
最后,我需要一个布尔值来决定是否将它们视为相同。它不一定是完美的,但理想情况下应该很少出错。
我可以使用什么算法来量化这两个字符串彼此之间的相似程度,然后我可以通过一些启发式方法将其转换为是/否答案?
【问题讨论】:
-
我以前用过 Levenshtein 距离。易于实施...en.wikipedia.org/wiki/Levenshtein_distance
-
Boost中有Levenshtein距离吗?
-
抱歉,没有建设性...这里是wiki page you were looking for。
-
@djechlin 为什么?这是一个有趣的问题。
-
@WhozCraig:谢谢,但这不公平,请做出您的回答并收集代表。 :)
标签: algorithm language-agnostic string-comparison stdstring heuristics