2013-01-05 36 views
5

Tôi đã thấy rất nhiều tài liệu trên web về cách thức hoạt động của python NLTK giúp dễ dàng tính toán các từ lớn.NLTK giúp dễ dàng tính toán các từ lớn. Còn chữ cái thì sao?

Còn chữ cái thì sao?

Điều tôi muốn làm là cắm từ điển và cho nó biết tần suất tương đối của các cặp chữ cái khác nhau.

Cuối cùng tôi muốn thực hiện một số loại quy trình markov để tạo các từ có khả năng tìm kiếm (nhưng giả).

+1

gì bạn có thể làm chỉ đơn giản là lấy chuỗi từ của mình, nhưng có tokenize tokenizer của bạn bằng thư thay vì bằng lời, và sau đó chạy mô hình bigram của bạn trên bộ mã thông báo thư đó. – jdotjdot

Trả lời

5

Dưới đây là một ví dụ (modulo tương đối Tần suất phân phối) sử dụng Counter từ collections mô-đun:

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

Cách sử dụng:

$ 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

Nếu bigrams là tất cả các bạn cần, bạn không cần phải NLTK . Bạn chỉ có thể làm điều đó như sau:

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 

Output:

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 
Các vấn đề liên quan