Как выделить индексный номер с помощью SimhashIndex() для набора данных документа?
Этот код реализует функцию 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".
0 ответов
Не вдаваясь в детали вашего кода, k - это максимальное расстояние Хемминга, которое вы хотите разрешить. k никогда не может быть больше, чем число битов в вашем simhash, и обычно оно не будет больше, чем 6 или 7 для большинства корпусов реального мира. Часто это должно быть как 2 или 3.
Увеличение k приведет к резкому увеличению времени процессора и / или памяти, необходимых для обнаружения сходства. Вы не увидите эффектов этого, пока ваша система не будет загружена, и в ваших хэш-таблицах будет много симашей.
Чтобы лучше понять, что такое k, посмотрите это объяснение simhash.
Также обратите внимание, что вы не найдете сходства между примерами текстов, которые вы жестко закодировали. Они очень короткие и, следовательно, изменение даже одного слова приводит к слишком большой пропорции функций. Simhash может обнаружить сходство только тогда, когда изменения очень незначительны.