比较/匹配java中的字符串

问题描述:

我正在处理一个有两列的大型数据库。第一列idlong,而第二列nameStringname是具有相应ID的人员的姓名。所以,我想比较其他行的name行与其他行的name比较/匹配java中的字符串

John Carter 
john Carter 
Carter 
jo car 
Willam Carter 
C William 
Carter j. 

所有这些行中的name应提供匹配。如果可能的话,获得比赛的比例/比率将会很好。有没有任何可以做到这一点的Java库/代码片段?我接受所有建议。

+4

约翰怎么会匹配“威廉卡特”? –

+1

@OliCharlesworth Sorrry,我的坏。 –

+0

同样,“C.威廉”和“约翰卡特”? –

这个库可以为你有意思:http://sourceforge.net/projects/simmetrics/

它弦乐提供不同的相似措施。

从他们的SourceForge页面:

SimMetrics是相似度计量库,例如从编辑距离的 (Levenshtein,Gotoh,Jaro等)转换为其他度量(例如Soundex, Chapman)。

看起来您会对计算字符串距离的Levenshtein algorithm感兴趣。你可以找到一个Java实现here

查看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