我需要比较字符串来决定它们是否代表相同的东西。这与人类输入的案例标题有关,其中缩写和其他小细节可能有所不同。例如,考虑以下两个标题:
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 中?如果您可以计算公共连续字符的数量并取非共享字符的比率,也许这将是一个很好的启发式方法?
最后,我需要一个关于是否将它们视为相同的布尔决定。它不一定是完美的,但理想情况下它应该很少出错。
我可以使用什么算法来量化这两个字符串彼此之间的相似程度,然后我可以通过一些启发式方法将其转换为是/否答案?