根据关键字

时间:2016-01-08 16:07:37

标签: statistics probability

我有2个文档X和Y.如果用户搜索单词“Computer”,我想在关键字“Computer”上显示最相关的文档。我的算法根据关键字在文档中出现的时间选择最相关的文档。唯一的问题是文档X有10个单词,单词“Computer”出现两次,而文档Y有1000个单词,单词“Computer”出现100次。没有理由说文档Y比文档X更相关查看它们中的单词数量。

如何对此进行规范化以获得最准确的相关文档。

1 个答案:

答案 0 :(得分:0)

您所描述的是在搜索查询和文档之间使用余弦相似性。 https://en.wikipedia.org/wiki/Cosine_similarity

余弦相似度

评估文本余弦相似度的标准是为每个查询和文档创建稀疏向量。向量表示查询和文档的术语计数。为简单起见,我将对稀疏向量使用python dict表示法。

query = {"computer":1}
document = {"the":1, "computer":1, "was":1, ...} # 100 in total.

然后你需要计算:

cosine_similarity = dot(query, document) / (norm(query) * norm(document))

在这个例子中,我们可以通过乘以常用术语的值来评估点积,并且我们可以使用根平方和来评估查询和文档的规范。以下是计算方法的示例。

点积是两个向量中常见单词值的乘积之和。

# Computer is the only common term, otherwise we would add the products
dot(query, document) = query['computer'] * document['computer'] = 1

norm(query) = sqrt(sum(value**2 for value in query.values())) = 1
norm(document) sqrt(sum(value**2 for value in query.values())) = 10

cosine_similarity(query, document) = dot(query, document) 
                          / (norm(query) * norm(document)) = 0.1

您可能会遇到的另一个问题是某些词比其他词更常见。这将使他们的术语匹配不那么有用。出于这个原因,许多应用程序使用tf-idf weights而不是简单的术语计数来进行余弦相似。这会将术语计数乘以其相对稀有度log(1/frequency),而不是使用原始值。

此外,你可以找到很多很好的余弦相似性和tf-idf的实现,一个是scikit-learn。 http://scikit-learn.org/stable/modules/metrics.html由于您有搜索特定问题,您可能需要考虑实现余弦相似性的lucene。

Jaccard相似度

您可以考虑另一个指标是jaccard相似度。它更容易理解,但通常不如余弦相似性有效。 Jaccard相似度定义为两个文档中的单词数除以任一文档中的单词数。在数学术语中,交叉点除以联合。