2011-12-30 16 views
19

Bối cảnh:Hiểu NLTK điểm sắp xếp thứ tự cho bigrams và bát quái

Tôi cố gắng để so sánh các cặp từ để xem những cặp là "nhiều khả năng xảy ra" trong tiếng Anh Mỹ hơn cặp khác. Kế hoạch của tôi là/đã sử dụng các cơ sở sắp xếp thứ tự trong NLTK để chấm điểm các cặp từ, với cặp điểm cao hơn là nhiều khả năng nhất.

Cách tiếp cận:

tôi mã sau đây trong Python sử dụng NLTK (vài bước và nhập khẩu loại bỏ cho ngắn gọn):

bgm = nltk.collocations.BigramAssocMeasures() 
finder = BigramCollocationFinder.from_words(tokens) 
scored = finder.score_ngrams(bgm.likelihood_ratio ) 
print scored 

Kết quả:

sau đó tôi đã kiểm tra kết quả sử dụng 2 cặp từ, một trong số đó nên có khả năng xuất hiện cao, và một cặp không nên ("hạt điều rang" và "hạt điều xăng"). Tôi đã rất ngạc nhiên khi thấy các điểm ghép nối từ này giống hệt nhau:

[(('roasted', 'cashews'), 5.545177444479562)] 
[(('gasoline', 'cashews'), 5.545177444479562)] 

Tôi đã mong đợi 'hạt điều rang' có điểm cao hơn 'điều hạt xăng' trong thử nghiệm của tôi.

Câu hỏi:

  1. Am Tôi hiểu lầm việc sử dụng những cụm từ?
  2. Mã của tôi có đúng không?
  3. Giả sử rằng điểm số sẽ khác sai và nếu có thì tại sao?

Cảm ơn bạn rất nhiều về mọi thông tin hoặc trợ giúp!

+0

Một nhận xét bổ sung: Nhóm tất cả 4 từ lại với nhau, viz 'điều hạt điều rang rang', cho kết quả tương tự trong đó tất cả các điểm số lớn đều giống nhau. – ccgillett

Trả lời

26

Tài liệu thu thập NLTK có vẻ khá tốt đối với tôi. http://www.nltk.org/howto/collocations.html

Bạn cần cung cấp cho người ghi bàn một số kho văn bản khá lớn để hoạt động. Đây là một ví dụ làm việc bằng cách sử dụng kho màu nâu được xây dựng trong NLTK. Mất khoảng 30 giây để chạy.

import nltk.collocations 
import nltk.corpus 
import collections 

bgm = nltk.collocations.BigramAssocMeasures() 
finder = nltk.collocations.BigramCollocationFinder.from_words(
    nltk.corpus.brown.words()) 
scored = finder.score_ngrams(bgm.likelihood_ratio ) 

# Group bigrams by first word in bigram.           
prefix_keys = collections.defaultdict(list) 
for key, scores in scored: 
    prefix_keys[key[0]].append((key[1], scores)) 

# Sort keyed bigrams by strongest association.         
for key in prefix_keys: 
    prefix_keys[key].sort(key = lambda x: -x[1]) 

print 'doctor', prefix_keys['doctor'][:5] 
print 'baseball', prefix_keys['baseball'][:5] 
print 'happy', prefix_keys['happy'][:5] 

Sản lượng có vẻ hợp lý, hoạt động tốt cho bóng chày, ít hơn cho bác sĩ và hạnh phúc.

doctor [('bills', 35.061321987405748), (',', 22.963930079491501), 
    ('annoys', 19.009636692022365), 
    ('had', 16.730384189212423), ('retorted', 15.190847940499127)] 

baseball [('game', 32.110754519752291), ('cap', 27.81891372457088), 
    ('park', 23.509042621473505), ('games', 23.105033513054011), 
    ("player's", 16.227872863424668)] 

happy [("''", 20.296341424483998), ('Spahn', 13.915820697905589), 
('family', 13.734352182441569), 
(',', 13.55077617193821), ('bodybuilder', 13.513265447290536) 
+1

Ok, điều này giải thích một số hiểu lầm của tôi. Có cách nào thuận tiện để tìm kiếm một bigram và có được điểm số tương đối không? Vẫn đang tìm kiếm một mẫu sử dụng sẽ cho phép tôi kiểm tra một bigram cho phù hợp. Và cảm ơn câu trả lời của bạn, rất hữu ích! – ccgillett

+0

Bạn có thể sử dụng mã như với một kho văn bản lớn và giữ điểm trong một từ điển lớn có trọng số lớn, hoặc duy trì số lượng unigram và số nguyên lớn hơn (nltk gọi những FreqDist) này mà bạn nạp vào bộ cân đối nội dung lớn khi bạn muốn so sánh các bigrams cụ thể. –

+1

Cảm ơn! Tôi đã có một giải pháp rất thú vị khi sử dụng một kho lưu trữ tùy chỉnh tối qua. Nó làm một công việc tốt trên một số vấn đề khó khăn. Cảm ơn bạn đã bỏ chặn tôi! – ccgillett