这可能是一个相当基本的NLP问题,但我手头有以下任务:我有一组文本文档,我需要根据(英语)词汇得分,这些词汇可能是1,2,3 - 等N
- 字长。 N
受一些“合理”数字的限制,但字典中各种n = 1, ..., N
值的分布可能相当一致。例如,该词典可以包含某种类型的设备列表,并且我想查看给定文档是否可能与这些设备中的任何设备有关。因此,如果文档中出现任何一个或多个词典条目,我希望将文档评分为高(呃)。
在考虑可能出现在词典中的各种形式的单词时,什么是标准NLP技术进行评分?输入文档和词典都需要进行哪种预处理才能执行评分?预处理和评分都有哪种开源工具?
答案 0 :(得分:2)
我差不多一年前研究了LSI和主题建模,所以我所说的应该只是一个指针,让你大致了解在哪里看。
有许多不同的方法可以做到这一点,取得了不同程度的成功。这是information retrieval领域的一个难题。您可以搜索topic modeling以了解不同的选项和最新技术。
如果单词可以以不同的形式出现,您肯定需要一些预处理和规范化。 NLTK和它的一个提取器怎么样:
>>> from nltk.stem.lancaster import LancasterStemmer
>>> st = LancasterStemmer()
>>> st.stem('applied')
'apply'
>>> st.stem('applies')
'apply'
您有一个术语词典,我将称之为 terms 以及一堆文档。我将探索一种非常基本的技术来对文档进行排名。你可以阅读更多更复杂的方法,但我认为如果你不寻找太复杂和严谨的东西,这可能就足够了。
这称为矢量空间IR模型。术语和文档都转换为k维空间中的向量。为此,我们必须构建一个逐个文档矩阵。这是一个样本矩阵,其中数字代表文档中术语的频率:
到目前为止,我们有一个3x4矩阵,使用该矩阵可以用三维数组(每列)表示每个文档。但随着术语数量的增加,这些数组变得太大而且越来越稀疏。此外,在大多数文档中都会出现许多单词,例如I
或and
,而不会添加太多语义内容。所以你可能想忽略这些类型的单词。对于大和稀疏的问题,您可以使用称为SVD的数学技术,该技术可以缩小矩阵,同时保留它包含的大部分信息。
此外,我们在上图中使用的数字是原始计数。另一种技术是使用布尔值:1表示存在,0表示文档中缺少术语。但是这些假设词语具有相同的语义权重。实际上,较少的单词比普通单词具有更多权重。因此,编辑初始矩阵的一种好方法是使用tf-id等排名函数为每个术语指定相对权重。如果到现在为止我们已经将SVD应用于我们的加权逐个文档矩阵,我们可以构造k维查询向量,它们只是术语权重的数组。如果我们的查询包含同一术语的多个实例,则可以使用频率和术语权重的乘积。
我们需要做的事情有点直截了当。我们通过分析它们的cosine similarities来比较查询向量和文档向量,这将是文档相对于查询的排名的基础。