6

Python NLTKを使用すると、単語のバイグラムを簡単に計算できるようになる方法について、Web全体で大量のドキュメントを見てきました。

手紙はどうですか?

私がやりたいのは、辞書をプラグインして、さまざまな文字のペアの相対的な頻度を教えてもらうことです。

最終的には、ある種のマルコフ過程を作成して、見た目が良い(しかし偽の)単語を生成したいと思います。

4

2 に答える 2

5

コレクションモジュールのCounterを使用した例(モジュロ相対度数分布)を次に示します。

#!/usr/bin/env python

import sys
from collections import Counter
from itertools import islice
from pprint import pprint

def split_every(n, iterable):
    i = iter(iterable)
    piece = ''.join(list(islice(i, n)))
    while piece:
        yield piece
        piece = ''.join(list(islice(i, n)))

def main(text):
    """ return ngrams for text """
    freqs = Counter()
    for pair in split_every(2, text): # adjust n here
        freqs[pair] += 1
    return freqs

if __name__ == '__main__':
    with open(sys.argv[1]) as handle:
        freqs = main(handle.read()) 
        pprint(freqs.most_common(10))

使用法:

$ python 14168601.py lorem.txt
[('t ', 32),
 (' e', 20),
 ('or', 18),
 ('at', 16),
 (' a', 14),
 (' i', 14),
 ('re', 14),
 ('e ', 14),
 ('in', 14),
 (' c', 12)]
于 2013-01-05T04:44:07.833 に答える
5

バイグラムだけが必要な場合は、NLTKは必要ありません。あなたは単に次のようにそれを行うことができます:

from collections import Counter
text = "This is some text"
bigrams = Counter(x+y for x, y in zip(*[text[i:] for i in range(2)]))
for bigram, count in bigrams.most_common():
    print bigram, count

出力:

is 2
s  2
me 1
om 1
te 1
 t 1
 i 1
e  1
 s 1
hi 1
so 1
ex 1
Th 1
xt 1
于 2013-01-06T14:21:17.247 に答える