问题描述
如何在Java字符串列表中仅检索一组相似字符串中的一个。
我有一个文本数据列表(列表长度为?60000)(存储为字符串),其中有几组彼此非常相似的文本。 从这个列表中,我想创建一个新列表,每个相似列表元素组只有一个元素
简化示例:
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
对于相似性函数,我使用了类似的Levenshtein距离Java库。 但是,即使将jre内存增加到6GB,我最终也会遇到Java堆空间问题
我还删除了停用词,并使用稀疏矩阵将其转换为术语向量。 但是,这非常慢。
我确实认为我可以使用重写equals()
和hashcode()
选项,因为由于我是模糊匹配,所以我不能保证hashcode()
对于仅相似的字符串是相等的。
有人可以建议一种对我的算法更有效的方法吗? 我对数据结构有些不满,一直在绞尽脑汁,在网上寻找解决方案。
希望我的问题清楚。 谢谢
1楼
按照建议,我使用Lucene索引了每个字符串,这使检查相似性的整体性能更好!
我确实在遇到了另一个建议的替代方案它看起来可能有用,但由于我从Lucene那里得到了所需的东西,所以没有尝试。
谢谢!