我有流式字符串(包含文字和数字的文字)。
一次取一行来传输字符串,我想为它们分配一个唯一的值。
示例可能是:带有分数/散列的字符串
User1 logged in Comp1 port8087 1109
User2 logged in comp2 1135
user3 logged in port8080 1098
user1 logged in comp2 port8080 1178
这些字符串应该在同一个集群中。对于这个我所想的是映射(糟糕的散列类型)字符串,这样字符串中的小变化不会影响分数那么多。
这样做的一个简单方法可能是:采取 UliCp8 , Ulic ....(即每个句子的第一个字母)并找到一些得分方式。之后,类似的得分字符串将保存在同一个存储桶中,然后再将其分组。
改进的方法是:不要取出字符串中每个单词的第一个单词,但找到一些方法来获取单词的代表值,使得字符串表示可能非常适合用于得分/散列映射,如我所述
考虑Levenstein距离或jaccard_index或某些相似距离矩阵,所有这些都需要输入字符串进行比较。是不是有任何方法可以在不进行比较的情况下对字符串进行散列/评分。(POS标记,比较看起来不太适合我的目的,因为数据是流式传输,数量巨大,非结构化)
希望你明白我想要实现的目标,请帮助我。忘了下面的评论,然后重新开始。
答案 0 :(得分:2)
“至少两个相似的单词(不考虑长度)应具有相似的散列值”
这违反了哈希函数的最基本要求。使用散列函数,输入的最小变化也应该对散列所属的桶产生激烈的变化。
您正在寻找一种算法来计算两个输入之间的相似性或距离。
答案 1 :(得分:2)
如上所述,您不正在寻找哈希函数,而是像the Levenshtein distance这样的算法,该算法用于计算表示两个比特序列之间的差异程度的度量。它通常用于找出两个字符串的相似/不相似之处。散列/消息摘要适用于为唯一的,不同的值创建标识符,但它们会为“相似”值产生完全不同的结果。
您对字符串的相似性感兴趣。这是一个很好的post,它命名了一些用于测量字符串相似性的资源。也许Lucene可以帮助您处理您的情况。