应用 NLP:如何根据多词术语词典对文档进行评分?

Applied NLP: how to score a document against a lexicon of multi-word terms?

这可能是一个相当基本的 NLP 问题,但我手头有以下任务:我有一组文本文档,需要根据可能是 1-、2- 的(英语)术语词典进行评分, 3- etc N-字长。 N 受一些 "reasonable" 数字的限制,但词典中针对 n = 1, ..., N 的各种值的各种术语的分布可能相当均匀。例如,这个词典可以包含特定类型的设备列表,我想看看给定的文档是否可能与这些设备中的任何一个有关。因此,如果文档出现一次或多次出现任何词典条目,我想给它打高分。

在考虑可能出现在词典中的各种形式的单词的同时进行评分的标准 NLP 技术是什么?输入文档和词典都需要什么样的预处理才能执行评分?预处理和评分都有哪些开源工具?

我大约一年前学习了 LSI 和主题建模,所以我所说的应该只是一个指针,让您大致了解在哪里看。

有许多不同的方法可以做到这一点并取得不同程度的成功。这是 information retrieval. You can search for topic modeling 领域中的一个难题,需要了解不同的选项和最新技术。

如果单词可以以不同的形式出现,你肯定需要一些预处理和规范化。 NLTK 及其词干分析器之一:

>>> from nltk.stem.lancaster import LancasterStemmer
>>> st = LancasterStemmer()
>>> st.stem('applied')
'apply'
>>> st.stem('applies')
'apply'

您有一个术语词典,我将其称为 terms,还有一堆 documents。我将探索一种非常基本的技术来根据术语对文档进行排名。您可以阅读更多更复杂的方法,但我认为如果您不想寻找过于复杂和严谨的东西,这可能就足够了。

这称为矢量 space IR 模型。术语和文档都被转换为 k 维向量 space。为此,我们必须构建一个 term-by-document 矩阵。这是一个示例矩阵,其中数字表示文档中术语的频率:

到目前为止,我们有一个 3x4 矩阵,每个文档都可以用一个 3 维数组(每列)表示。但是随着项数的增加,这些数组变得太大并且越来越稀疏。此外,大多数文档中出现了很多词,例如 Iand,但没有添加太多语义内容。所以你可能想忽略这些类型的词。对于大和稀疏的问题,您可以使用一种称为 SVD 的数学技术,它可以缩小矩阵,同时保留其包含的大部分信息。

此外,我们在上表中使用的数字是原始计数。另一种技术是使用布尔值:1 表示存在,0 表示文档中缺少术语。但是这些假设单词具有相同的语义权重。实际上,稀有词比常见词具有更多 权重。因此,编辑初始矩阵的一个好方法是使用 tf-id 等排名函数为每个项分配相对权重。如果现在我们已经将 SVD 应用于我们的加权文档矩阵,我们可以构建 k 维查询向量,它们只是一个词权重数组。如果我们的查询包含同一术语的多个实例,则将使用频率和术语权重的乘积。

我们需要从那里做的事情有点简单。我们通过分析 cosine similarities 来比较查询向量和文档向量,这将是文档相对于查询排名的基础。