大约一年前, 我学习了LSI和主题建模,所以我所说的应该仅作为一个指针,让您大致了解在哪里寻找。
有许多不同的方法可以取得不同程度的成功。这是信息检索领域的难题。您可以搜索主题建模以了解不同的选项和最新技术。
如果单词可以以不同的形式出现,您肯定需要一些预处理和规范化。NLTK 和它的一个词干分析器怎么样:
>>> from nltk.stem.lancaster import LancasterStemmer
>>> st = LancasterStemmer()
>>> st.stem('applied')
'apply'
>>> st.stem('applies')
'apply'
你有一个术语词典,我将称之为术语,还有一堆文档。我将探索一种非常基本的技术来根据术语对文档进行排名。您可以阅读大量更复杂的方法,但我认为如果您不是在寻找过于复杂和严格的东西,这可能就足够了。
这称为向量空间 IR 模型。术语和文档都被转换为 k 维空间中的向量。为此,我们必须构建一个逐个文档矩阵。这是一个样本矩阵,其中的数字表示文档中术语的频率:

到目前为止,我们有一个 3x4 矩阵,每个文档可以使用该矩阵由一个 3 维数组(每列)表示。但是随着术语数量的增加,这些数组变得太大并且越来越稀疏。此外,在大多数文档中出现了许多诸如I
或之类的词,而没有添加太多语义内容。and
所以你可能想忽略这些类型的词。对于大和稀疏的问题,您可以使用一种称为SVD的数学技术,在缩小矩阵的同时保留其包含的大部分信息。
此外,我们在上图中使用的数字是原始计数。另一种技术是使用布尔值:1 表示存在,0 表示文档中没有术语。但是这些假设单词具有相同的语义权重。实际上,稀有词比普通词更有分量。因此,编辑初始矩阵的一个好方法是使用诸如tf-id 之类的排名函数来为每个术语分配相对权重。如果现在我们已经将 SVD 应用于我们的加权逐个文档矩阵,我们可以构建 k 维查询向量,它们只是一个词权重的数组。如果我们的查询包含同一术语的多个实例,则将使用频率和术语权重的乘积。
我们需要从那里做的事情有点简单。我们通过分析它们的余弦相似性来比较查询向量和文档向量,这将是文档相对于查询排名的基础。