如何从文档列表中识别术语

问题描述 投票:0回答:1

给出可以由一个,两个或什至三个词组成的预定义术语的列表。问题在于用一组免费词汇(即,很多单词)来统计一组文档中它们的出现次数。

我一直在使用gensim来构成一袋单词并在使用新短语时检测索引

e.g。

dict_terms = corpora.Dictionary(phrases)

sentence = unseen_docs[0]
idxs     = dict_terms[sentence]

然后计算出现的idx,考虑索引是否为顺序索引,这意味着只看到了一个术语,而不是其中的2 o 3。

python nlp information-retrieval
1个回答
0
投票

在Scikit-learn(一个非常流行的Python机器学习软件包)中,有一个模块可以完全满足您的要求:

这里是操作方法:

首先安装sklearn

pip install scikit-learn

现在输入代码:

from sklearn.feature_extraction.text import CountVectorizer

vectorizer = CountVectorizer(ngram_range=(1, 3))

#Given your corpus is an iterable of strings, or a List of strings, for simplicity:
corpus = [...]

X = vectorizer.fit_transform(corpus)

print(X)

输出是大小为m x n的矩阵。 E.g:

[[0 1 1 1 0 0 1 0 1]
 [0 2 0 1 0 1 1 0 1]
 [1 0 0 1 1 0 1 1 1]
 [0 1 1 1 0 0 1 0 1]]

Columns代表单词,lines代表文档。因此,对于每一行,您都有结果的单词包。

但是如何检索哪些单词出现在哪里?您可以使用以下方法获取每个“列”名称:

print(vectorizer.get_feature_names())

您将获得单词列表(单词按字母顺序组织。)>

现在,假设您想知道每个单词出现在语料库中的次数(而不是单个文档)。

您作为输出接收的矩阵是一个“ numpy”(另一个包)数组。通过执行以下操作可以很容易地将其展平(将所有行加和):

import numpy as np #np is like a convention for numpy, if you don't know this already.

sum_of_all_words = np.sum(X, axis=0)

会给你类似的东西:

[[1 4 2 4 1 1 4 1 4]]

这些单词的列顺序是相同的。

最后,您可以通过执行以下操作从词典中过滤出术语:

dict_terms = corpora.Dictionary(phrases)
counts = {}
words = vectorizer.get_feature_names()
for idx, word in enumerate(words):
   if word in dict_terms:
      counts[word] = sum_of_all_words[0, idx]


希望这会有所帮助!

在此处阅读有关CountVectorizer的更多信息:https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.CountVectorizer.html#sklearn.feature_extraction.text.CountVectorizer

((也请看一下TFIDFVectorizer,如果您使用的是单词包,则tf-idf在大多数情况下是一个巨大的升级)

我也建议您查看此页面,以使用sklearn进行特征提取:https://scikit-learn.org/stable/modules/feature_extraction.html

© www.soinside.com 2019 - 2024. All rights reserved.