如何使用spacy找到最常用的单词?

时间:2016-05-16 11:54:13

标签: python nlp spacy

我正在使用spacy和python,它可以很好地标记每个单词,但我想知道是否有可能找到字符串中最常见的单词。还有可能得到最常见的名词,动词,副词等吗?

包含了count_by函数,但我似乎无法以任何有意义的方式运行它。

3 个答案:

答案 0 :(得分:15)

我最近不得不计算文本文件中所有令牌的频率。您可以使用pos_属性过滤单词以获得您喜欢的POS令牌。这是一个简单的例子:

import spacy
from collections import Counter
nlp = spacy.load('en')
doc = nlp(u'Your text here')
# all tokens that arent stop words or punctuations
words = [token.text for token in self.doc if token.is_stop != True and token.is_punct != True]

# noun tokens that arent stop words or punctuations
nouns = [token.text for token in self.doc if token.is_stop != True and token.is_punct != True and token.pos_ == "NOUN"]

# five most common tokens
word_freq = Counter(words)
common_words = word_freq.most_common(5)

# five most common noun tokens
noun_freq = Counter(nouns)
common_nouns = noun_freq.most_common(5)

答案 1 :(得分:9)

这应该与计算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属性提供了更丰富的树库标签。

答案 2 :(得分:2)

我很晚才添加到该线程中。但是,实际上,有一种内置的方式可以在spacy中使用doc.count_by()函数。

import spacy
import spacy.attrs
nlp = spacy.load("en_core_web_sm")
doc = nlp("It all happened between November 2007 and November 2008")

# Returns integers that map to parts of speech
counts_dict = doc.count_by(spacy.attrs.IDS['POS'])

# Print the human readable part of speech tags
for pos, count in counts_dict.items():
    human_readable_tag = doc.vocab[pos].text
    print(human_readable_tag, count)

输出为:

动词1

ADP 1

CCONJ 1

DET 1

NUM 2

PRON 1

PROPN 2