2013-01-05 3 views
5

Ich habe im Internet jede Menge Dokumentation darüber gesehen, wie es mit dem Python NLTK einfach ist, Bigramme von Wörtern zu berechnen.NLTK macht es leicht, Bigramme von Wörtern zu berechnen. Was ist mit Briefen?

Was ist mit Buchstaben?

Was ich tun möchte, ist ein Wörterbuch einstecken und mir die relativen Häufigkeiten der verschiedenen Buchstabenpaare sagen.

Schließlich möchte ich eine Art Markov-Prozess machen, um wahrscheinlich aussehende (aber falsche) Wörter zu erzeugen. Hier

+1

Was können Sie tun, indem Sie die Zeichenfolge von Wörtern nehmen, sondern haben Ihre tokenizer tokenize mit Schreiben statt durch Wort und führen Sie dann Ihr Bigramm-Modell auf diesem Brief-Token-Set. – jdotjdot

Antwort

5

ist ein Beispiel (Modulo Relative Häufigkeitsverteilung) mit Zähler aus dem collections Modul:

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

Verbrauch:

$ 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

Wenn Bigrams ist alles, was Sie benötigen, die Sie nicht brauchen NLTK . Sie können es einfach wie folgt:

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 

Ausgang:

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