2013-01-05 3 views
5

私は、Python NLTKがどのようにしてバイグラムの単語を計算しやすくするかについて、ウェブ上にたくさんのドキュメンテーションを見ました。NLTKでは、バイグラムの単語を簡単に計算できます。手紙はどうですか?

文字はどうですか?

私がしたいことは、辞書を差し込み、異なる文字のペアの相対頻度を教えてもらいたいことです。

最終的には、見込みのある(しかし偽の)単語を生成するためのマルコフプロセスをいくつか作りたいと思います。ここで

+1

あなたは、単に言葉のあなたの文字列を取るが、文字ではなく、言葉によって、あなたのトークナイザのトークン化を持って、その後、実行されて何ができますかその文字トークンセットのバイグラムモデル – jdotjdot

答えて

5

collectionsモジュールからのカウンターを使用した例(モジュロ相対度数分布)である:

#!/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)] 
4

、あなたは必要ありません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 
関連する問題