如何使用spacy找到最常用的单词?
问题描述:
我使用python spacy和它的工作正常标记每个单词,但我想知道是否有可能找到一个字符串中最常见的单词。还有可能获得最常见的名词,动词,副词等吗?如何使用spacy找到最常用的单词?
有一个count_by函数,但我似乎无法让它以任何有意义的方式运行。
答
这应该看起来与在Python中对其他东西进行计数基本相同。 spaCy允许您迭代文档,并返回一系列令牌对象。这些可用于访问注释。
from __future__ import print_function, unicode_literals
import spacy
from collections import defaultdict, Counter
nlp = spacy.load('en')
pos_counts = defaultdict(Counter)
doc = nlp(u'My text here.')
for token in doc:
pos_counts[token.pos][token.orth] += 1
for pos_id, counts in sorted(pos_counts.items()):
pos = doc.vocab.strings[pos_id]
for orth_id, count in counts.most_common():
print(pos, count, doc.vocab.strings[orth_id])
请注意,.orth和.pos属性是整数。您可以通过.orth_和.pos_属性获取它们映射的字符串。 .orth属性是令牌的非标准化视图,还有.lower,.lemma等字符串视图。你可能想绑定一个.norm函数来做你自己的字符串规范化。有关详细信息,请参阅文档。
整数对于您的计数很有用,因为如果您计算的是大型语料库,则可以使计数程序更加高效地存储内存。您还可以将频繁计数存储在一个numpy数组中,以提高速度和效率。如果你不想打扰这个,可以直接用.orth_属性来计算,或者使用别名.text。
请注意,上面代码片段中的.pos属性给出了一组粗糙的词性标签。更丰富的树库标签在.tag属性中可用。
答
我最近不得不计算文本文件中所有记号的频率。您可以使用pos_属性过滤出单词以获得您喜欢的POS令牌。这里有一个简单的例子: