web-dev-qa-db-ja.com

NLTKでバイグラムを生成する

たとえば、特定の文のバイグラムリストを作成しようとしています。入力した場合、

    To be or not to be

プログラムで生成したい

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

私は次のコードを試しましたが、私に与えます

<generator object bigrams at 0x0000000009231360>

これは私のコードです:

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

それで、私が欲しいものをどうやって手に入れるのですか?上記のような単語の組み合わせのリストが必要です(be、be、または、not、not、to、be)。

13

nltk.bigrams() は、バイグラムのイテレータ(具体的にはジェネレータ)を返します。リストが必要な場合は、イテレータをlist()に渡します。また、バイグラムを生成するアイテムのシーケンスを想定しているため、テキストを渡す前に分割する必要があります(まだ行っていない場合)。

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

それらをコンマで区切って印刷するには、(in python 3):

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

On python 2の場合、たとえば:

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

印刷のためだけにリストを生成する必要はなく、イテレータを使用するだけです。

16
Ilja Everilä

次のコードは、特定の文のbigramリストを生成します

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