web-dev-qa-db-fra.com

Comment trouver les mots les plus courants en utilisant Spacy?

J'utilise spacy avec python et son bon fonctionnement pour baliser chaque mot, mais je me demandais s'il était possible de trouver les mots les plus courants dans une chaîne. Il est également possible d'obtenir le plus noms communs, verbes, adverbes et ainsi de suite?

Il y a une fonction count_by incluse mais je n'arrive pas à la faire fonctionner de manière significative.

15
Harry Loyd

J'ai récemment dû compter la fréquence de tous les jetons dans un fichier texte. Vous pouvez filtrer les mots pour obtenir les jetons POS que vous aimez en utilisant l'attribut pos_. Voici un exemple simple:

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)
22
Paras Dahal

Cela devrait ressembler à compter n'importe quoi d'autre en Python. spaCy vous permet de parcourir simplement le document et vous récupérez une séquence d'objets Token. Ceux-ci peuvent être utilisés pour accéder aux annotations.

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])

Notez que les attributs .orth et .pos sont des entiers. Vous pouvez obtenir les chaînes auxquelles ils correspondent via les attributs .orth_ et .pos_. L'attribut .orth est la vue non normalisée du jeton, il y a aussi la vue de chaîne .lower, .lemma etc. Vous voudrez peut-être lier une fonction .norm, pour faire votre propre normalisation de chaîne. Voir les documents pour plus de détails.

Les nombres entiers sont utiles pour vos comptages car vous pouvez rendre votre programme de comptage beaucoup plus efficace en mémoire, si vous comptez sur un grand corpus. Vous pouvez également stocker les comptages fréquents dans un tableau numpy, pour plus de vitesse et d'efficacité. Si vous ne voulez pas vous en préoccuper, n'hésitez pas à compter directement avec l'attribut .orth_ ou utilisez son alias .text.

Notez que l'attribut .pos dans l'extrait ci-dessus donne un ensemble grossier de balises de partie de discours. Les balises d'arborescence plus riches sont disponibles sur l'attribut .tag.

9
syllogism_

J'ajoute à ce fil assez tard. TOUTEFOIS, il existe, en fait, un moyen intégré de le faire en utilisant la fonction doc.count_by () dans 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)

La sortie est:

VERBE 1

ADP 1

CCONJ 1

DET 1

NUM 2

PRON 1

PROPN 2

2
kalidurge