如何只检索java中字符串列表中的一组相似字符串中的一个

时间:2015-07-25 19:56:33

标签: java string fuzzy-search

如何只检索java中字符串列表中一组相似字符串中的一个。

我有一个文本数据列表(列表长度约为60000)(存储为字符串),其中有一组文本彼此非常相似。 从这个列表中我想创建一个新列表,每个类似列表元素组只有1个元素

简化示例:

the boy ate an apple
boy ate apple
the boy ate apple

新列表中只应包含上述内容之一

我的一般方法是有2个列表: 原始列表和一个包含唯一列表的新列表

For each text in original_list
    for each utext in the unique list
        if similarity(text, utext) > threshold (threshold can be 90%)
            break
        else
            is_similar = false
    end for

    if is_similar = false   
        add text to unique list
end for

对于相似度函数,我使用了simmetrics Levenshtein距离java库。 但是,即使我将jre内存增加到6GB

,我最终也会遇到java堆空间问题

我还删除了停用词并使用稀疏矩阵转换为术语向量。但是,这很慢。

我认为我可以使用覆盖equals()hashcode()选项,因为我是模糊匹配的,我不能保证hashcode()对于只相似的字符串是相等的。< / p>

有人能建议我的算法更有效吗?我对数据结构有点生疏,一直绞尽脑汁,在网上寻找解决方案。

我希望我的问题很明确。感谢

1 个答案:

答案 0 :(得分:2)

我按照建议使用Lucene来索引每个字符串,这使检查相似性的整体性能更好!

我确实遇到了另一个建议的替代here看起来可能有效,但没有尝试,因为我从Lucene得到了我需要的东西。

谢谢!