2010-03-16 38 views
53

Tôi có một loạt các mục văn bản- HTML thô từ cơ sở dữ liệu MySQL. Tôi muốn tìm các cụm từ phổ biến nhất trong các mục này (không phải là cụm từ phổ biến nhất, và lý tưởng nhất là không thực thi đối sánh từng từ).Cách trích xuất các cụm từ phổ biến/quan trọng từ một loạt các mục nhập văn bản

dụ của tôi là bất kỳ đánh giá về Yelp.com, cho thấy 3 đoạn từ hàng trăm ý kiến ​​của một nhà hàng nào đó, trong các định dạng:

"Hãy thử những chiếc bánh hamburger" (trong 44 đánh giá)

ví dụ , "Xem lại nổi bật" của trang này:

http://www.yelp.com/biz/sushi-gen-los-angeles/

tôi có NLTK cài đặt và tôi đã chơi đùa với nó một chút, nhưng tôi thành thật choáng ngợp bởi các tùy chọn. Điều này có vẻ giống như một vấn đề khá phổ biến và tôi đã không thể tìm thấy một giải pháp đơn giản bằng cách tìm kiếm ở đây.

+1

với nltk, thật dễ dàng để có được bigrams và trigram, nhưng những gì tôi đang tìm kiếm là những cụm từ có nhiều khả năng từ 7 đến 8 từ.Tôi đã không tìm ra cách để làm cho nltk (hoặc một số phương pháp khác) cung cấp 'octograms' và ở trên. – arronsky

Trả lời

0

Vâng, để bắt đầu, có thể bạn sẽ phải xóa tất cả các thẻ HTML (tìm kiếm "< [^>] *>" và thay thế bằng ""). Sau đó, bạn có thể thử cách tiếp cận ngây thơ của việc tìm kiếm các chất nền phổ biến dài nhất giữa hai mục văn bản, nhưng tôi không nghĩ rằng bạn sẽ nhận được kết quả rất tốt. Bạn có thể làm tốt hơn bằng cách chuẩn hóa các từ (giảm chúng thành dạng cơ bản, xóa tất cả dấu trọng âm, đặt mọi thứ xuống chữ thường hoặc chữ hoa) trước tiên và rồi phân tích. Một lần nữa, tùy thuộc vào những gì bạn muốn hoàn thành, bạn có thể nhóm các mục văn bản tốt hơn nếu bạn cho phép linh hoạt thứ tự từ, tức là xử lý các mục văn bản như các túi của các từ được chuẩn hóa và đo độ tương đồng về nội dung của túi.

Tôi đã nhận xét về chủ đề tương tự (mặc dù không giống hệt) here.

75

Tôi nghi ngờ bạn không chỉ muốn các cụm từ phổ biến nhất, mà là bạn muốn thú vị nhất collocations. Nếu không, bạn có thể kết thúc bằng việc mô tả quá nhiều cụm từ được tạo thành từ các từ phổ biến và ít cụm từ thú vị và mang tính thông tin hơn.

Để làm điều này, về cơ bản bạn sẽ muốn trích xuất n-grams từ dữ liệu của mình và sau đó tìm những từ có số lượng cao nhất point wise mutual information (PMI). Đó là, bạn muốn tìm những từ đồng xuất hiện với nhau nhiều hơn bạn mong đợi họ tình cờ.

Các NLTK collocations how-to bao gồm làm thế nào để làm điều này trong một khoảng 7 dòng mã, ví dụ .:

import nltk 
from nltk.collocations import * 
bigram_measures = nltk.collocations.BigramAssocMeasures() 
trigram_measures = nltk.collocations.TrigramAssocMeasures() 

# change this to read in your data 
finder = BigramCollocationFinder.from_words(
    nltk.corpus.genesis.words('english-web.txt')) 

# only bigrams that appear 3+ times 
finder.apply_freq_filter(3) 

# return the 10 n-grams with the highest PMI 
finder.nbest(bigram_measures.pmi, 10) 
+1

Vâng, tôi đồng ý-- và nhìn vào trang đó, tôi có thể nhận được như xa như bi và tri-gram, nhưng làm thế nào là điều này mở rộng đến n-gram? Tôi tin rằng tôi sẽ cần các cụm từ có độ dài> 5 để thực sự thú vị và có lẽ tôi đang thể hiện sự thiếu hiểu biết của mình, nhưng trang demo này chỉ cho phép tôi nhận được 2 và 3 từ? – arronsky

+3

Vì lý do đó, tôi nghĩ bạn cần mở rộng nltk.collocations.AbstractCollocationFinder, sử dụng BigramCollocationFinder và TrigramCollocationFinder làm hướng dẫn, xem http://nltk.googlecode.com/svn/trunk/doc/api/nltk.collocations-pysrc .html. Nhưng, bạn có chắc bạn thực sự cần những cụm từ dài như vậy? Trên Yelp, có vẻ như họ đang làm nổi bật những từ đơn lẻ và collocations với một vài từ trong đó, trong ví dụ liên kết của bạn họ có sashimi, Little Tokyo và cá. Sau đó, họ chọn một câu hoàn chỉnh chứa mỗi từ hoặc cụm từ thú vị. – dmcer

+3

Điều này. Tôi nghĩ bạn hoàn toàn chính xác. Brilliant (và thanh lịch) quan sát! – arronsky

3

nếu bạn chỉ muốn để có được lớn hơn 3 ngrams bạn có thể thử này. Tôi giả sử bạn đã loại bỏ tất cả rác như html, v.v.

import nltk 
ngramlist=[] 
raw=<yourtextfile here> 

x=1 
ngramlimit=6 
tokens=nltk.word_tokenize(raw) 

while x <= ngramlimit: 
    ngramlist.extend(nltk.ngrams(tokens, x)) 
    x+=1 

Có lẽ không phải là rất nhiệt tình vì tôi chỉ làm việc này một tháng hoặc lâu hơn, nhưng có thể giúp đỡ!

+1

-1 điều này không làm gì cho tôi. tôi đang ở trong tình huống tương tự như OP, và phương pháp của bạn vừa trả về một danh sách khổng lồ các bộ dữ liệu theo cấu trúc của văn bản gốc. tôi nên tiến hành như thế nào? – magnetar

+0

Một khi bạn có danh sách đó, bạn cần phải lặp qua nó để đếm sự hiện diện của các ngram độc đáo. Một cách để làm điều này là tạo ra một dict trong đó khóa là ngram và tăng nó mỗi khi bạn nhận được một trận đấu – Toby

+0

Tôi cũng không nhận được điều này. Làm thế nào để bạn tính số gram duy nhất? đó là một túi từ riêng lẻ. –

3

Tôi nghĩ rằng những gì bạn đang tìm kiếm là chunking. Tôi khuyên bạn nên đọc chapter 7 of the NLTK book hoặc có thể là bài viết của riêng tôi trên chunk extraction. Cả hai đều giả định kiến ​​thức về gắn thẻ từng phần, được bao gồm trong chapter 5.

+0

tôi thực sự không thấy những gì chunking đã làm với nó. – magnetar

+1

Chunking có thể phân tích các cụm từ và khi bạn có cụm từ, bạn có thể xác định các cụm từ phổ biến và quan trọng. – Jacob

Các vấn đề liên quan