1

这段代码实现了四组数据的 Simhash 函数。

import re
from simhash import Simhash, SimhashIndex
def get_features(s):
   width = 3
   s = s.lower()
   s = re.sub(r'[^\w]+', '', s)
   return [s[i:i + width] for i in range(max(len(s) - width + 1, 1))]

data = {
1: u'How are you? I Am fine. blar blar blar blar blar Thanks.',
2: u'How are you i am fine. blar blar blar blar blar than',
3: u'This is simhash test.',
 }
objs = [(str(k), Simhash(get_features(v))) for k, v in data.items()]
index = SimhashIndex(objs, k=3)

现在我已经使用这段代码来索引一个巨大的数据集(训练数据集:train_data)。

def get_features(s):
   width = 3
    return [s[i:i + width] for i in range(max(len(s) - width + 1, 1))]

objs = [(str(k), Simhash(get_features(data_train[k]))) for k in range(len(data_train))]
index=SimhashIndex(objs,k=500)

但如果我把

'k=3'

它有效,但对于像

'k=500'

它进入永无止境的循环。请告诉我为什么会发生这种情况以及如何获取所有“data_train”数据的索引号。

4

1 回答 1

1

在不详细介绍您的代码的情况下,k 是您希望允许的最大汉明距离。k 永远不能大于您的 simhash 中的位数,对于大多数现实世界的语料库,它通常不会大于 6 或 7。通常它必须小到 2 或 3。

增加 k 将导致 CPU 时间和/或检测相似性所需的存储量急剧增加。在您的系统处于负载状态之前,您不会看到这种影响,并且您的哈希表中有很多 simhashes。

为了更好地理解 k 是什么,请参阅simhash 的解释

另请注意,您不会发现硬编码的示例文本之间有相似之处。它们非常短,因此即使改变一个词也会改变太大比例的特征。Simhash 只能在变化非常轻微时检测相似性。

于 2019-08-06T14:24:37.583 回答