如何估算查询特定文档的重要性?

时间:2019-06-02 23:28:24

标签: python machine-learning nlp artificial-intelligence information-retrieval

我有两个单词列表:

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

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

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

有什么方法可以计算qdoc1doc2之间的“相关性”或无礼分数吗?我的直觉告诉我可以通过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 个答案:

答案 0 :(得分:1)

使用tf-idf的前提是要重点放在文本中出现的稀有单词上:前提是过分专注于过于普通的单词将无法确定哪些单词有意义,哪些没有。

在您的示例中,这是在Python中实现tf-idf的方法:

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.]])

但是,为了理解这个矩阵,我们现在希望以单词频率升序存储为pandas数据帧:

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标记为重要的单词,来潜在地获得相关性评分。

答案 1 :(得分:1)

基本上,您必须以某种方式将单词表示为数字,以便可以对它们进行算术运算以找到“相似性”。 TF-IDF就是这样一种方式,Michael Grogan的答案应该可以帮助您入门。

另一种方法是使用预训练的Word2Vec或GloVe模型。这些单词嵌入模型将单词映射到一组数字,这些数字代表单词的语义。

诸如Gensim之类的库使您可以非常轻松地使用预训练的嵌入模型来衡量相似度。参见此处:https://github.com/RaRe-Technologies/gensim-data

===

编辑:要进行更高级的词嵌入,请检出ELMo或BERT