Как найти наиболее распространенные слова, используя spacy?

Я использую spacy с python и прекрасно работаю для пометки каждого слова, но мне было интересно, можно ли найти наиболее распространенные слова в строке. Также возможно получить наиболее распространенные существительные, глаголы, наречия и т.д.

Там включена функция count_by, но я не могу заставить ее работать каким-либо значимым образом.

Ответ 1

Мне недавно пришлось подсчитать частоту всех токенов в текстовом файле. Вы можете отфильтровать слова, чтобы получить 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 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 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)

Ответ 2

Это должно выглядеть в основном так же, как считать что-либо еще в Python. spaCy позволяет вам просто перебирать документ, и вы возвращаете последовательность объектов Token. Они могут использоваться для доступа к аннотациям.

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 etc string-view. Возможно, вам понадобится привязать функцию .norm, чтобы выполнить собственную нормализацию строки. Подробнее см. В документах.

Целые числа полезны для ваших подсчетов, потому что вы можете сделать вашу программу подсчета более эффективной с точки зрения памяти, если вы рассчитываете на большой корпус. Вы также можете хранить частые подсчеты в массиве numpy для дополнительной скорости и эффективности. Если вы не хотите беспокоиться об этом, не стесняйтесь считать атрибутом .orth_ напрямую или использовать его псевдоним .text.

Обратите внимание, что атрибут .pos в приведенном выше фрагменте дает крупнозернистый набор тегов части речи. Более богатые теги treebank доступны в атрибуте .tag.

Ответ 3

Я добавляю в эту ветку довольно поздно. ОДНАКО, на самом деле, есть встроенный способ сделать это с помощью функции doc.count_by() в spacy.

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)

Вывод:

VERB 1

ADP 1

CCONJ 1

ДЕТ 1

NUM 2

PRON 1

PROPN 2