2013-01-05 7 views
5

Widziałem mnóstwo dokumentacji w Internecie o tym, jak python NLTK ułatwia obliczanie bigrams słów.NLTK ułatwia obliczanie bigrams słów. A co z listami?

A co z literami?

Co chcę zrobić, to podłączyć słownik i powiedzieć mi względne częstotliwości różnych par liter.

Ostatecznie chciałbym dokonać pewnego rodzaju procesu Markowa, aby wygenerować prawdopodobne (ale fałszywe) słowa.

+1

Co można zrobić, to po prostu wziąć swój ciąg słów, ale mają swój tokenizer tokenize listem zamiast po słowie, a następnie uruchom Twój model bigram na tym zestawie list-token. – jdotjdot

Odpowiedz

5

Oto przykład (modulo Względny rozkład częstotliwości) przy użyciu licznika z modułu 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)) 

Zastosowanie:

$ 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

Jeśli bigrams jest wszystko, czego potrzeba, nie trzeba NLTK . Można po prostu zrobić to w następujący sposób:

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 

wyjściowa:

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 
Powiązane problemy