Лучшее соответствие входному запросу из набора документов

У меня есть 8 документов, и я запустил TF-IDF, чтобы получить массив. Я не понимаю, как узнать, какой документ лучше всего подходит для данного входного запроса?

all_documents = [doc1, doc2, ...., doc7]
sklearn_tfidf = TfidfVectorizer(norm='l2',min_df=0, use_idf=True, smooth_idf=False, sublinear_tf=True, tokenizer=tokenize)
sklearn_representation = sklearn_tfidf.fit_transform(all_documents).toarray()

person user3235169    schedule 21.03.2017    source источник
comment
Под лучшим документом вы подразумеваете документ, наиболее близкий к входному запросу? Вы должны подогнать TfidfVectorizer к входному запросу, а затем найти расстояние до вектора из 7 документов, которые у вас есть (это может быть косинусное расстояние/евклидово расстояние).   -  person titipata    schedule 21.03.2017
comment
@titipat спасибо за подход. Но насколько я понимаю, для нахождения любого из упомянутых расстояний длина векторов должна быть одинаковой. Как я это сделаю?   -  person user3235169    schedule 22.03.2017


Ответы (1)


Преобразуйте ввод в формат tf-idf, используя TfidfVectorizer. Затем вы можете использовать метрику расстояния (косинус, евклидово, манхэттенское и т. д.), чтобы вычислить документ, ближайший к вашему вводу.

В каждом из документов должен использоваться один и тот же словарь. Я предполагаю, что ваши 8 векторов документов имеют одинаковую длину? Созданный вами объект sklearn_tfidf имеет атрибут vocabulary_, содержащий все слова, используемые в векторах. Ваш входной запрос должен быть сокращен до содержания только этих слов.

Пример

Document1: dogs are cute
Document2: cats are awful

Приводит к словарному запасу [dogs, cats, are, cute, awful]. Запрос, содержащий другие слова, кроме этих 5, не может быть использован. Например, если ваш запрос cute animals, animals не имеет значения, поскольку его нельзя найти ни в одном из документов. Таким образом, запрос сводится к следующему вектору: [0,0,0,1,0], поскольку cute — единственное слово, которое можно найти в документах.

person PinkFluffyUnicorn    schedule 21.03.2017
comment
Спасибо за подход. Но насколько я понимаю, для нахождения любого из упомянутых расстояний длина векторов должна быть одинаковой. Как я это сделаю? - person user3235169; 22.03.2017
comment
В каждом из документов должен использоваться один и тот же словарь. Я предполагаю, что ваши 8 векторов документов имеют одинаковую длину? Созданный вами объект sklearn_tfidf имеет атрибут vocabulary_, содержащий все слова, используемые в векторах. Ваш входной запрос должен быть сокращен до содержания только этих слов. - person PinkFluffyUnicorn; 22.03.2017
comment
Да, длина каждого вектора равна 1058. Но как преобразовать входную строку в длину вектора размера 1058? - person user3235169; 22.03.2017
comment
Я попробовал и могу увидеть список словарного запаса длиной 1058. Должен ли я построить вектор длины 1 и 0, сравнивая каждое слово во входном запросе с vocabulary_, или в scikit есть метод обучения, который я могу использовать напрямую? - person user3235169; 22.03.2017
comment
Я думаю, что эта тема может вам помочь. - person PinkFluffyUnicorn; 22.03.2017