2010-03-16 34 views
53

मेरे पास टेक्स्ट आइटम्स की श्रृंखला है- एक MySQL डेटाबेस से कच्चे HTML। मैं इन प्रविष्टियों में सबसे आम वाक्यांश ढूंढना चाहता हूं (एकल सबसे आम वाक्यांश नहीं, और आदर्श रूप से, शब्द-शब्द-शब्द मिलान को लागू नहीं करना)।टेक्स्ट प्रविष्टियों की एक श्रृंखला से आम/महत्वपूर्ण वाक्यांशों को निकालने के लिए कैसे करें

मेरे उदाहरण Yelp.com पर किसी भी समीक्षा, किसी दिए गए रेस्तरां की समीक्षा के सैकड़ों से 3 के टुकड़े से पता चलता है कि, स्वरूप में है:

"हैमबर्गर प्रयास करें" (44 समीक्षा में)

जैसे "समीक्षा हाइलाइट" इस पेज के अनुभाग:

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

मैं NLTK स्थापित किया है और मैं चारों ओर इसके साथ एक सा खेला है, लेकिन ईमानदारी से विकल्पों से अभिभूत हूँ। यह एक आम समस्या की तरह लगता है और मैं यहां खोज करके एक सीधा समाधान खोजने में सक्षम नहीं हूं।

+1

एनएलटीके के साथ, यह बिग्राम और ट्रिग्राम प्राप्त करने में काफी आसान है, लेकिन जो मैं खोज रहा हूं वह वाक्यांश हैं जो लंबाई में 7-8 शब्द अधिक हैं।मुझे पता नहीं है कि एनएलटीके (या कुछ अन्य विधि) को ऐसे 'ऑक्टोग्राम' और ऊपर प्रदान करने के तरीके को कैसे बनाया जाए। – arronsky

उत्तर

0

ठीक है, शुरुआत के लिए आपको शायद सभी HTML टैग्स को निकालना होगा ("< [^>] *>" के लिए खोजें और इसे "" के साथ बदलें)। उसके बाद, आप प्रत्येक दो पाठ वस्तुओं के बीच सबसे लंबे समय तक सामान्य सबस्ट्रिंग की तलाश करने के निष्पक्ष दृष्टिकोण का प्रयास कर सकते हैं, लेकिन मुझे नहीं लगता कि आपको बहुत अच्छे परिणाम मिलेंगे। आप शब्दों को सामान्यीकृत करके (उन्हें अपने मूल रूप में कम करने, सभी उच्चारणों को हटाने, सबकुछ को कम या ऊपरी मामले में सेट करने) पहले और पर विश्लेषण करके बेहतर कर सकते हैं। फिर, जो आप पूरा करना चाहते हैं उसके आधार पर, यदि आप कुछ शब्द ऑर्डर लचीलापन की अनुमति देते हैं, तो आप पाठ वस्तुओं को बेहतर तरीके से क्लस्टर करने में सक्षम हो सकते हैं, यानी टेक्स्ट आइटम को सामान्यीकृत शब्दों के बैग के रूप में मानें और बैग सामग्री समानता को मापें।

मैंने एक समान (हालांकि समान नहीं) विषय here पर टिप्पणी की है।

75

मुझे संदेह है कि आप केवल सबसे आम वाक्यांश नहीं चाहते हैं, बल्कि आप सबसे दिलचस्प कॉलोकेशन चाहते हैं। अन्यथा, आप सामान्य शब्दों से बने वाक्यांशों और कम दिलचस्प और सूचनात्मक वाक्यांशों के अतिरेक के साथ समाप्त हो सकते हैं।

ऐसा करने के लिए, आप अनिवार्य रूप से अपने डेटा से एन-ग्राम निकालना चाहते हैं और फिर उन लोगों को ढूंढें जिनमें उच्चतम point wise mutual information (पीएमआई) है। यही है, आप उन शब्दों को खोजना चाहते हैं जो आपसे अपेक्षा करते हैं कि आप उन्हें मौका दे सकते हैं।

NLTK collocations how-to कैसे कोड का एक के बारे में 7 लाइनों में उदाहरण के लिए: यह करने के लिए, .:

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

हां, मैं सहमत हूं - और उस पृष्ठ को देखकर, मैं द्विपक्षीय और त्रि-ग्राम तक पहुंच सकता हूं, लेकिन यह एन-ग्राम तक कैसे बढ़ाया जाता है? मेरा मानना ​​है कि मुझे लंबाई के वाक्यांशों की आवश्यकता होगी> 5 वास्तव में दिलचस्प होने के लिए, और शायद मैं अपनी अज्ञानता व्यक्त कर रहा हूं, लेकिन यह डेमो पृष्ठ केवल मुझे 2 और 3 शब्द सेट प्राप्त करने देता है? – arronsky

+3

इसके लिए, मुझे लगता है कि आपको एक गाइड के रूप में BigramCollocationFinder और TrigramCollocationFinder का उपयोग करके nltk.collocations.AbstractCollocationFinder का विस्तार करने की आवश्यकता होगी, http://nltk.googlecode.com/svn/trunk/doc/api/nltk.collocations-pysrc देखें एचटीएमएल। लेकिन, क्या आप वाकई ऐसे लंबे वाक्यांशों की ज़रूरत है? येलप पर, ऐसा लगता है कि वे एकल शब्दों और कॉलोकेशन को दो शब्दों के साथ हाइलाइट कर रहे हैं, आपके लिंक किए गए उदाहरण में उनके पास सशिमी, लिटिल टोक्यो और मछली है। फिर वे एक पूर्ण वाक्य का चयन करते हैं जिसमें प्रत्येक रोचक शब्द या वाक्यांश होता है। – dmcer

+3

यह। मुझे लगता है कि आप बिल्कुल सही हैं। शानदार (और सुरुचिपूर्ण) अवलोकन! – arronsky

3

अगर आप सिर्फ बड़े से अधिक 3 ngrams आप इस कोशिश कर सकते हैं करने के लिए प्राप्त करना चाहते हैं को शामिल किया गया। मैं यह सोचते करती हूं कि आप एचटीएमएल आदि जैसे सभी कबाड़ बाहर छीन लिया है

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 
शायद नहीं

बहुत pythonic के रूप में मैं गया है केवल इस एक महीने कर रहा या तो अपने आप को, लेकिन मदद की हो सकती है!

+1

-1 यह मेरे लिए कुछ भी नहीं किया। मैं ओपी के समान स्थिति में हूं, और आपकी विधि ने मूल पाठ की संरचना के बाद टुपल्स की एक विशाल सूची लौटा दी है। मुझे कैसे आगे बढ़ना चाहिए? – magnetar

+0

एक बार जब आप उस सूची में हों तो आपको अद्वितीय ngrams की उपस्थिति की गणना करने के लिए इसके माध्यम से लूप की आवश्यकता होगी। ऐसा करने का एक तरीका एक ऐसा नियम बनाकर है जहां कुंजी ngram है और हर बार जब आप मैच प्राप्त करते हैं तो इसे बढ़ाना – Toby

+0

मुझे यह भी नहीं मिलता है। आप अद्वितीय ग्राम कैसे गिनते हैं? यह व्यक्तिगत शब्दों का एक बैग है। –

3

मुझे लगता है कि आप जो खोज रहे हैं वह खंडन कर रहा है। मैंने chapter 7 of the NLTK book पढ़ने या शायद chunk extraction पर अपना लेख पढ़ने की अनुशंसा की। इनमें से दोनों भाग-भाषण टैगिंग के ज्ञान को मानते हैं, जो chapter 5 में शामिल है।

+0

मैं वास्तव में नहीं देखता कि इसके साथ क्या करना है। – magnetar

+1

चंकिंग वाक्यांशों का विश्लेषण कर सकते हैं, और एक बार आपके पास वाक्यांश हो सकते हैं, तो आप सामान्य और महत्वपूर्ण वाक्यांशों की पहचान कर सकते हैं। – Jacob