web-dev-qa-db-fra.com

Générer des bigrammes avec NLTK

J'essaie de produire une liste bigramme d'une phrase donnée par exemple, si je tape,

    To be or not to be

Je veux que le programme génère

     to be, be or, or not, not to, to be

J'ai essayé le code suivant mais me donne juste

<generator object bigrams at 0x0000000009231360>

Voici mon code:

    import nltk
    bigrm = nltk.bigrams(text)
    print(bigrm)

Alors, comment puis-je obtenir ce que je veux? Je veux une liste de combinaisons des mots comme ci-dessus (être, être ou, ou pas, ne pas être).

13

nltk.bigrams() retourne un itérateur (un générateur en particulier) de bigrammes. Si vous voulez une liste, passez l'itérateur à list(). Il attend également une séquence d'éléments pour générer des bigrammes, vous devez donc diviser le texte avant de le passer (si vous ne l'avez pas fait):

bigrm = list(nltk.bigrams(text.split()))

Pour les imprimer séparés par des virgules, vous pouvez (dans python 3):

print(*map(' '.join, bigrm), sep=', ')

Si on python 2, alors par exemple:

print ', '.join(' '.join((a, b)) for a, b in bigrm)

Notez que pour l'impression, vous n'avez pas besoin de générer une liste, utilisez simplement l'itérateur.

16
Ilja Everilä

Le code suivant produit une liste bigram pour une phrase donnée

>>> import nltk
>>> from nltk.tokenize import Word_tokenize
>>> text = "to be or not to be"
>>> tokens = nltk.Word_tokenize(text)
>>> bigrm = nltk.bigrams(tokens)
>>> print(*map(' '.join, bigrm), sep=', ')
to be, be or, or not, not to, to be
8