2013-01-05 11 views
5

Ho visto tonnellate di documentazione in tutto il Web su come il python NLTK rende facile calcolare bigrammi di parole.NLTK semplifica il calcolo dei bigram di parole. Che mi dici delle lettere?

E le lettere?

Quello che voglio fare è collegare un dizionario e dirmi le frequenze relative di coppie di lettere diverse.

In fin dei conti mi piacerebbe fare una sorta di processo markov per generare parole dall'aspetto probabile (ma finto).

+1

Che cosa si può fare è semplicemente prendere la stringa di parole, ma avere il vostro tokenize tokenizer per lettera invece che con la parola, e quindi eseguire il tuo modello di bigram su quel set di token letterali. – jdotjdot

risposta

5

Ecco un esempio (modulo relativo Frequenza di distribuzione) con contatore dal modulo 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)) 

Usage:

$ 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

Se bigrammi è tutto ciò che serve, non è necessario NLTK . Si può semplicemente fare come segue:

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 

uscita:

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