Как оценить важность запроса для конкретного документа? - PullRequest
0 голосов
/ 03 июня 2019

У меня есть два списка слов:

q = ['hi', 'how', 'are', 'you']

doc1 = ['hi', 'there', 'guys']

doc2 = ['how', 'is', 'it', 'going']

Можно ли как-то рассчитать оценку "релевантности" или оценки невежества между q и doc1 и doc2?Моя интуиция подсказывает мне, что я могу сделать это через IDF.Следовательно, это реализация для idf:

def IDF(term,allDocs):
    docsWithTheTerm = 0
     for doc in allDocs:
            if term.lower() in allDocs[doc].lower().split():
                docsWithTheTerm = docsWithTheTerm + 1
            if docsWithTheTerm > 0:
                return 1.0 + log(float(len(allDocs)) / docsWithTheTerm)
            else:
                return 1.0

Однако, это не дает мне что-то вроде «оценки релевантности».Является ли IDF правильным способом получения оценки релевантности?В случае IDF - это неправильный способ измерения важности запроса для данного документа, как я могу получить что-то вроде «оценки релевантности»?

Ответы [ 2 ]

1 голос
/ 06 июня 2019

По сути, вы должны каким-то образом представлять слова в виде чисел, чтобы вы могли сделать арифметику с ними, чтобы найти «сходство». TF-IDF - один из таких способов, и ответ Майкла Грогана должен помочь вам начать там.

Другой способ - использовать предварительно обученную модель Word2Vec или GloVe. Эти модели встраивания слов отображают слова в набор чисел, которые представляют семантическое значение слова.

Библиотеки, такие как Gensim, позволят вам очень легко использовать предварительно встроенные модели встраивания для измерения сходства. Смотрите здесь: https://github.com/RaRe-Technologies/gensim-data

===

Редактировать: Для более сложного встраивания слов, ознакомьтесь с ELMo или BERT

1 голос
/ 03 июня 2019

Предпосылка использования tf-idf заключается в том, чтобы сделать акцент на более редких словах, которые появляются в тексте: предпосылка, которая фокусируется на слишком общих словах, не позволит определить, какие слова являются значимыми, а какие нет.

В вашем примере, вот как вы можете реализовать tf-idf в Python:

doc1 = ['hi', 'there', 'guys']
doc2 = ['how', 'is', 'it', 'going']
doc1=str(doc1)
doc2=str(doc2)

stringdata=doc1+doc2
stringdata

import re
text2=re.sub('[^A-Za-z]+', ' ', stringdata)

from nltk.tokenize import word_tokenize
print(word_tokenize(text2))
text3=word_tokenize(text2)

Слова были размечены и выглядят следующим образом:

['hi', 'there', 'guys', 'how', 'is', 'it', 'going']

Затем генерируется матрица:

from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer()
matrix = vectorizer.fit_transform(text3).todense()

Это матричный вывод:

matrix([[0., 0., 1., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0., 0., 1.],
        [0., 1., 0., 0., 0., 0., 0.],
        [0., 0., 0., 1., 0., 0., 0.],
        [0., 0., 0., 0., 1., 0., 0.],
        [0., 0., 0., 0., 0., 1., 0.],
        [1., 0., 0., 0., 0., 0., 0.]])

Однако, чтобы разобраться в этой матрице, мы теперь хотим сохранить в качестве кадра данных панд с частотой слова в порядке возрастания:

import pandas as pd

# transform the matrix to a pandas df
matrix = pd.DataFrame(matrix, columns=vectorizer.get_feature_names())
# sum over each document (axis=0)
top_words = matrix.sum(axis=0).sort_values(ascending=True)

Вот что мы придумали:

going    1.0
guys     1.0
hi       1.0
how      1.0
is       1.0
it       1.0
there    1.0
dtype: float64

В этом примере у слов мало контекста - все три предложения являются общими введениями. Следовательно, tf-idf не обязательно раскрывает здесь что-либо значимое, но в контексте текста, содержащего, например, более 1000 слов, tf-idf может быть весьма полезен с точки зрения определения важности между словами. например Вы можете решить, что слова, встречающиеся в тексте 20-100 раз, встречаются редко, но обычно встречаются достаточно, чтобы заслужить важность.

В этом конкретном случае можно потенциально получить оценку релевантности, определив, сколько раз слова в запросе появляются в соответствующих документах, в частности, слова, которые tf-idf помечены как важные.

...