时间:2010-07-25 13:13:32

标签: algorithm string design-patterns

7 个答案:

答案 0 :(得分:21)

答案 1 :(得分:6)

答案 2 :(得分:4)

答案 3 :(得分:1)

答案 4 :(得分:1)

我已经解决了这样的问题,首先我对文本进行了规范化,并将字符串单词中没有值的字符串输出到整个字符串中,就像InC一样。美国......

这个无价值的词必须由你定义。

标准化后,我使用Jaro Winkler距离按名称运行检查,并将结果分组到一个具有相似对象列表的对象中。

非常好。

我在带有30K人名的java中运行它

我希望这个想法对某人有用

答案 5 :(得分:0)

有一个针对此确切问题的解决方案,记录在开源Java库中用于模糊匹配 https://github.com/intuit/fuzzy-matcher

此处使用的想法是分解单词(标记)中的名称,并使用文本匹配算法查找单词中的相似性(例如Soundex,Jaccard或Lavenshtiein)。

然后使用从每个单词中找到的分数并平均每个名称的分数。

这种匹配的性能非常关键,因为如果我们将每个名称保持匹配,这将成倍增长。

该库依赖于match算法的等价性和传递性 如果“ David”与“ Davey”匹配,则意味着反向匹配,而您不必进行这些匹配

该库还有其他一些技巧可以降低匹配的复杂性,而且我能够在大约2秒钟的时间内对4000个名称进行匹配。

答案 6 :(得分:-2)

以下是Levenshtein函数的SQL代码:

CREATE FUNCTION [Levenshtein](@str_1 nvarchar(4000), @str_2 nvarchar(4000))
RETURNS int
AS

BEGIN
 DECLARE    @str_1_len int
        ,   @str_2_len int
        ,   @str_1_itr int
        ,   @str_2_itr int
        ,   @str_1_char nchar
        ,   @Levenshtein int
        ,   @LD_temp int
        ,   @cv0 varbinary(8000)
        ,   @cv1 varbinary(8000)

SELECT  @str_1_len = LEN(@str_1)
    ,   @str_2_len = LEN(@str_2)
    ,   @cv1 = 0x0000
    ,   @str_2_itr = 1
    ,   @str_1_itr = 1
    ,   @Levenshtein = 0


WHILE @str_2_itr <= @str_2_len

SELECT  @cv1 = @cv1 + CAST(@str_2_itr AS binary(2))
    ,   @str_2_itr = @str_2_itr + 1

WHILE @str_1_itr <= @str_1_len
BEGIN
    SELECT  @str_1_char = SUBSTRING(@str_1, @str_1_itr, 1)
        ,   @Levenshtein = @str_1_itr
        ,   @cv0 = CAST(@str_1_itr AS binary(2))
        ,   @str_2_itr = 1

    WHILE @str_2_itr <= @str_2_len
    BEGIN
        SET @Levenshtein = @Levenshtein + 1
        SET @LD_temp = CAST(SUBSTRING(@cv1, @str_2_itr+@str_2_itr-1, 2) AS int) +
        CASE WHEN @str_1_char = SUBSTRING(@str_2, @str_2_itr, 1) THEN 0 ELSE 1 END
        IF @Levenshtein > @LD_temp SET @Levenshtein = @LD_temp
        SET @LD_temp = CAST(SUBSTRING(@cv1, @str_2_itr+@str_2_itr+1, 2) AS int)+1
        IF @Levenshtein > @LD_temp SET @Levenshtein = @LD_temp
        SELECT @cv0 = @cv0 + CAST(@Levenshtein AS binary(2)), @str_2_itr = @str_2_itr + 1
    END

SELECT @cv1 = @cv0, @str_1_itr = @str_1_itr + 1
END

RETURN @Levenshtein
END