2012-10-10 7 views
11

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

उदाहरण पाठ: यह पाठ है, जहां मैं परिभाषित करने के लिए है से बाहर "Lorem Ipsum मातम AMET बैठते हैं, consetetur sadipscing elitr, SED व्यास"

मैं unigrams बना सकते हैं, Bigrams, Trigrams, आदि जो "स्तर पर "इन unigrams बनाने के लिए। "स्तर" चरित्र, अक्षर, शब्द, ...

तो ऊपर दिए गए वाक्य से यूनिग्राम बनाने से बस सभी शब्दों की एक सूची बनाई जाएगी?

बिग्राम बनाने के परिणामस्वरूप शब्द जोड़े एक दूसरे को अनुसरण करने वाले शब्दों को एक साथ लाएंगे?

तो अगर पेपर एनजीआरएम मायने रखता है, तो यह टेक्स्ट से बाहर यूनिग्राम, बिग्राम, ट्रिग्राम इत्यादि बनाता है, और यह गणना करता है कि कितनी बार ngram होता है?

क्या Python के nltk पैकेज में कोई मौजूदा विधि है? या क्या मुझे अपने संस्करण को लागू करना है?

+1

तुम्हारा एक आम व्याख्या है देता है, लेकिन "ग्राम" इकाई हो सकता है जैसे बाइट्स या अक्षर भी। तो यदि आप एक स्लाइडिंग विंडो का उपयोग करते हैं तो "लोरेम" का चरित्र 3-ग्राम "लॉर" और "एम" या यहां तक ​​कि "लॉर", "अयस्क", "रीम" हो सकता है। – tripleee

उत्तर

15

मुझे अपना पुराना कोड मिला, शायद यह उपयोगी है।

import nltk 
from nltk import bigrams 
from nltk import trigrams 

text="""Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam ornare 
tempor lacus, quis pellentesque diam tempus vitae. Morbi justo mauris, 
congue sit amet imperdiet ipsum dolor sit amet, consectetur adipiscing elit. Nullam ornare 
tempor lacus, quis pellentesque diam""" 
# split the texts into tokens 
tokens = nltk.word_tokenize(text) 
tokens = [token.lower() for token in tokens if len(token) > 1] #same as unigrams 
bi_tokens = bigrams(tokens) 
tri_tokens = trigrams(tokens) 

# print trigrams count 

print [(item, tri_tokens.count(item)) for item in sorted(set(tri_tokens))] 
>>> 
[(('adipiscing', 'elit.', 'nullam'), 2), (('amet', 'consectetur', 'adipiscing'), 2),(('amet', 'imperdiet', 'ipsum'), 1), (('congue', 'sit', 'amet'), 1), (('consectetur', 'adipiscing', 'elit.'), 2), (('diam', 'tempus', 'vitae.'), 1), (('dolor', 'sit', 'amet'), 2), (('elit.', 'nullam', 'ornare'), 2), (('imperdiet', 'ipsum', 'dolor'), 1), (('ipsum', 'dolor', 'sit'), 2), (('justo', 'mauris', 'congue'), 1), (('lacus', 'quis', 'pellentesque'), 2), (('lorem', 'ipsum', 'dolor'), 1), (('mauris', 'congue', 'sit'), 1), (('morbi', 'justo', 'mauris'), 1), (('nullam', 'ornare', 'tempor'), 2), (('ornare', 'tempor', 'lacus'), 2), (('pellentesque', 'diam', 'tempus'), 1), (('quis', 'pellentesque', 'diam'), 2), (('sit', 'amet', 'consectetur'), 2), (('sit', 'amet', 'imperdiet'), 1), (('tempor', 'lacus', 'quis'), 2), (('tempus', 'vitae.', 'morbi'), 1), (('vitae.', 'morbi', 'justo'), 1)] 
+0

आपके कोड के लिए धन्यवाद! – akohout

+0

क्या यह सही है कि यह ट्रिग्राम के रूप में ['tempus', 'vitae', 'morbi'] की गणना करता है यदि वे एक ही वाक्य में नहीं हैं? – Mouscellaneous

-1

मुझे नहीं लगता कि इसके साथ मदद करने के लिए nltk में एक विशिष्ट विधि है। हालांकि यह मुश्किल नहीं है। यदि आपके पास एन शब्दों की एक वाक्य है (मान लीजिए कि आप शब्द स्तर का उपयोग कर रहे हैं), लंबाई 1-n के सभी ngrams प्राप्त करें, उन प्रत्येक ngrams के माध्यम से पुनरावृत्त करें और उन्हें एक सहयोगी सरणी में कुंजियां बनाएं, मान की गणना के साथ। कोड की 30 से अधिक पंक्तियां नहीं होनी चाहिए, आप इसके लिए अपना स्वयं का पैकेज बना सकते हैं और जहां आवश्यक हो वहां आयात कर सकते हैं।

+1

ठीक है, तो ऐसा लगता है जैसे मैं ngram सामान को सही ढंग से समझता हूं :) – akohout

2

जब आप एन-ग्राम गिनते हैं, तो गणना का उपयोग करने के बजाय हैश तालिका (शब्दकोश) का उपयोग करना बेहतर होता है। ऊपर उदाहरण के लिए:

unigrams = {} 
for token in tokens: 
    if token not in unigrams: 
    unigrams[token] = 1 
    else: 
    unigrams[token] += 1 

यह आपके समय जटिलता हे (एन)

+1

क्या यह एक उत्तर है? यदि ऐसा है तो कृपया इसे विवरण के साथ पोस्ट करें। – Sachith

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^