Je cherche un moyen de diviser un texte en n-grammes. Normalement, je ferais quelque chose comme:
import nltk
from nltk import bigrams
string = "I really like python, it's pretty awesome."
string_bigrams = bigrams(string)
print string_bigrams
Je suis conscient que nltk ne propose que des bigrammes et des trigrammes, mais y a-t-il un moyen de diviser mon texte en quatre grammes, cinq grammes ou même cent grammes?
Merci!
ingrams
dont le deuxième paramètre est le degré des ngrams que vous voulez. Est - CE la version de NLTK que vous utilisez? Même si ce n'est pas le cas, voici la source EDIT: Il y angrams
etingrams
là-dedans,ingrams
être générateur.Réponses:
Excellentes réponses basées sur Python natif données par d'autres utilisateurs. Mais voici l'
nltk
approche (juste au cas où l'OP serait pénalisé pour avoir réinventé ce qui existe déjà dans lanltk
bibliothèque).Il existe un module ngram que les gens utilisent rarement
nltk
. Ce n'est pas parce qu'il est difficile de lire les ngrams, mais l'entraînement d'un modèle basé sur des ngrams où n> 3 entraînera une grande rareté des données.la source
sixgrams
?Je suis surpris que cela ne se soit pas encore manifesté:
la source
Utiliser uniquement les outils nltk
Exemple de sortie
Afin de conserver les ngrams au format tableau, supprimez simplement
' '.join
la source
voici un autre moyen simple de faire des n-grammes
la source
Les gens ont déjà répondu assez bien pour le scénario où vous avez besoin de bigrammes ou de trigrammes, mais si vous avez besoin de chaque gramme pour la phrase, dans ce cas, vous pouvez utiliser
nltk.util.everygrams
Dans le cas où vous avez une limite comme dans le cas des trigrammes où la longueur maximale devrait être de 3, vous pouvez utiliser le paramètre max_len pour le spécifier.
Vous pouvez simplement modifier le paramètre max_len pour obtenir n'importe quel gramme, soit quatre grammes, cinq grammes, six ou même cent grammes.
Les solutions mentionnées précédemment peuvent être modifiées pour implémenter la solution mentionnée ci-dessus, mais cette solution est beaucoup plus simple que cela.
Pour plus d'informations, cliquez ici
Et lorsque vous avez juste besoin d'un gramme spécifique comme le bigramme ou le trigramme, etc., vous pouvez utiliser le nltk.util.ngrams comme mentionné dans la réponse de MAHassan.
la source
Vous pouvez facilement créer votre propre fonction pour le faire en utilisant
itertools
:la source
izip(*(islice(seq, index, None) for index, seq in enumerate(tee(s, N))))
je ne comprends pas très bien.Une approche plus élégante pour créer des bigrammes avec la fonction intégrée de python
zip()
. Convertissez simplement la chaîne d'origine en liste parsplit()
, puis passez la liste une fois normalement et une fois décalée d'un élément.la source
Je n'ai jamais traité avec nltk mais j'ai fait N-Grams dans le cadre d'un petit projet de classe. Si vous souhaitez trouver la fréquence de tous les N-grammes présents dans la chaîne, voici un moyen de le faire.
D
vous donnerait l'histogramme de vos N mots.la source
collections.Counter(tuple(strparts[i:i+N]) for i in xrange(len(strparts)-N))
fonctionnera plus rapidement que le try-exceptPour quatre_grammes, il est déjà en NLTK , voici un morceau de code qui peut vous aider dans ce sens:
J'espère que cela aide.
la source
Vous pouvez utiliser sklearn.feature_extraction.text.CountVectorizer :
les sorties:
Vous pouvez définir
ngram_size
n'importe quel entier positif. C'est-à-dire que vous pouvez diviser un texte en quatre grammes, cinq grammes ou même cent grammes.la source
Si l'efficacité est un problème et que vous devez construire plusieurs n-grammes différents (jusqu'à une centaine comme vous le dites), mais que vous voulez utiliser du python pur, je le ferais:
Utilisation:
~ Même vitesse que NLTK:
Republiez de ma réponse précédente .
la source
Nltk est génial, mais représente parfois une surcharge pour certains projets:
Exemple d'utilisation:
la source
Vous pouvez obtenir tous les 4-6 grammes en utilisant le code sans autre package ci-dessous:
la sortie est ci-dessous:
vous pouvez trouver plus de détails sur ce blog
la source
Après environ sept ans, voici une réponse plus élégante en utilisant
collections.deque
:Production:
la source
Si vous voulez une solution d'itérateur pure pour les grandes chaînes avec une utilisation constante de la mémoire:
Tester:
Production:
la source