比较/匹配java中的字符串
问题描述:
我正在处理一个有两列的大型数据库。第一列id
是long
,而第二列name
是String
。 name
是具有相应ID的人员的姓名。所以,我想比较其他行的name
行与其他行的name
。比较/匹配java中的字符串
John Carter
john Carter
Carter
jo car
Willam Carter
C William
Carter j.
所有这些行中的name
应提供匹配。如果可能的话,获得比赛的比例/比率将会很好。有没有任何可以做到这一点的Java库/代码片段?我接受所有建议。
答
这个库可以为你有意思:http://sourceforge.net/projects/simmetrics/
它弦乐提供不同的相似措施。
从他们的SourceForge页面:
SimMetrics是相似度计量库,例如从编辑距离的 (Levenshtein,Gotoh,Jaro等)转换为其他度量(例如Soundex, Chapman)。
答
查看William W. Cohen et al。的论文'A Comparison of String Distance Metrics for Name-Matching Tasks'。本文比较了几个字符串距离度量。
他们也在SecondString project内实施了其中的大部分。它是一个“开源的基于Java的近似字符串匹配技术包”,因此您可以轻松比较不同的度量标准以评估哪些符合您的要求。
如果您只需要匹配名称 - Jaro-Winkler是一个不错的选择,它也在SecondString包内实现。
如果您在数据库中包含所有名称,那么将相似性度量作为存储过程实现以避免获取所有数据以使用java进行比较可能是有意义的。所以你可以使用这样的查询:
SELECT t1.name, t2.name, sim(t1.name, t2.name) FROM table t1, table t2 WHERE sim(t1.name, t2.name) > 0.8
约翰怎么会匹配“威廉卡特”? –
@OliCharlesworth Sorrry,我的坏。 –
同样,“C.威廉”和“约翰卡特”? –