该代码实现了四组数据的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”数据的索引号。

最佳答案

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

k的增加将导致CPU时间和/或检测相似性所需的存储空间急剧增加。直到您的系统处于负载状态,并且哈希表中有许多类似符号时,您才能看到此效果。

为了更好地理解k是什么,请参阅此explanation of simhash

还要注意,您不会在硬编码的示例文本之间找到相似之处。它们非常短,因此即使更改一个单词也会改变部分特征。 Simhash仅在变化很小时才能检测到相似性。

关于python - 如何使用SimhashIndex()将索引编号分配给文档数据集?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50912414/

10-12 16:53