nltk

2015-11-07 8 views
5

का उपयोग कर एक पाठ फ़ाइल से सभी नामों को निकालने क्या यह करने का एक और अधिक प्रभावी तरीका है? मेरा कोड एक टेक्स्ट फ़ाइल पढ़ता है और सभी नामों को निकालता है।nltk

import nltk 

File = open(fileName) #open file 
lines = File.read() #read all lines 
sentences = nltk.sent_tokenize(lines) #tokenize sentences 
nouns = [] #empty to array to hold all nouns 

for sentence in sentences: 
    for word,pos in nltk.pos_tag(nltk.word_tokenize(str(sentence))): 
     if (pos == 'NN' or pos == 'NNP' or pos == 'NNS' or pos == 'NNPS'): 
      nouns.append(word) 

मैं इस कोड की समय जटिलता को कैसे कम करूं? लूप के लिए नेस्टेड का उपयोग करने से बचने का कोई तरीका है?

अग्रिम धन्यवाद!

+0

'if pos.startswith ('एनएन') के साथ अगर स्थिति को बदलें:', 'सेट' या 'संग्रह। काउंटर' का भी उपयोग करें, सूची न रखें। और एक सूची समझ के बजाय कुछ नक्शा/कम करें। अन्यथा, 'उथली पार्सिंग', उर्फ ​​'चंकिंग' – alvas

उत्तर

7

यदि आप NLTK के अलावा अन्य विकल्पों के लिए खुले हैं, तो TextBlob देखें। यह आसानी से सभी संज्ञाएं और संज्ञा पद के अर्क:

>>> from textblob import TextBlob 
>>> txt = """Natural language processing (NLP) is a field of computer science, artificial intelligence, and computational linguistics concerned with the inter 
actions between computers and human (natural) languages.""" 
>>> blob = TextBlob(txt) 
>>> print(blob.noun_phrases) 
[u'natural language processing', 'nlp', u'computer science', u'artificial intelligence', u'computational linguistics'] 
+0

आप कहते हैं "यह आसानी से सभी संज्ञाएं और संज्ञा पद के अर्क" लेकिन मैं केवल संज्ञाओं को निकालने के लिए विकल्प दिखाई नहीं देता। मैं आपके उदाहरण में "कंप्यूटर" या "विज्ञान" जैसे अकेले संज्ञा कैसे प्राप्त कर सकता हूं? – Sulli

+0

आप 'NN' केवल की तरह कुछ को फिल्टर करने की' blob.tags' इस्तेमाल कर सकते हैं '[n n के लिए, blob.tags में टी अगर टी == 'एनएन']'। –

+0

व्यक्तिगत रूप से, मैं ने पाया है कि 'TextBlob' प्रदर्शन करता है नहीं लगभग साथ ही साथ' –

1

मैं एक एनएलपी विशेषज्ञ नहीं हूं, लेकिन मुझे लगता है कि आप पहले से ही बहुत करीब हैं, और यहां इन बाहरी लूपों में चौकोर समय जटिलता से बेहतर होने का कोई तरीका नहीं है।

एनएलटीके के हाल के संस्करणों में एक फ़ंक्शन में बनाया गया है जो आप हाथ से कर रहे हैं, nltk.tag.pos_tag_sents, और यह टैग किए गए शब्दों की सूचियों की एक सूची भी देता है।

5
import nltk 

lines = 'lines is some string of words' 
# function to test if something is a noun 
is_noun = lambda pos: pos[:2] == 'NN' 
# do the nlp stuff 
tokenized = nltk.word_tokenize(lines) 
nouns = [word for (word, pos) in nltk.pos_tag(tokenized) if is_noun(pos)] 

print nouns 
>>> ['lines', 'string', 'words'] 

उपयोगी टिप: यह अक्सर) मामले कि सूची comprehensions .Insert (के साथ एक सूची में तत्वों को जोड़ने की तुलना में एक सूची बनाने का एक तेज तरीका है या संलग्न() विधि, एक 'के लिए' के ​​भीतर पाश ।

+0

आज़माएं उत्तर उत्तर की एक सही ट्रेन है। इसका उपयोग क्लीनर है: 'is_noun = lambda pos: सही अगर pos [: 2] == 'एनएन'। नोट: लूप के मुकाबले सूची समझना आवश्यक नहीं है। यह सिर्फ इतना है कि आपको एक सूची को पूरा करने और सूची के बजाय जनरेटर के रूप में नेस्टेड लूप से निपटने की आवश्यकता नहीं है। – alvas

+0

@alvas - मैंने कुछ ... 'pos [: 2] ==' एनएन '...' का उपयोग नहीं किया, क्योंकि यह अवांछित तारों से मेल खा सकता है। मुझे पता है कि, 'pos' हो सकता है जिसका 'एनएनए' का मूल्य हो, और हम उससे मेल नहीं खाते हैं। कड़ाई से बोलते हुए, 'सही अगर' और 'अन्यथा गलत' भाग आवश्यक नहीं हैं, लेकिन मैंने उन्हें स्पष्टता के लिए शामिल किया है। सूची समझ के बारे में अच्छी बात एक लूप की तुलना में जरूरी नहीं है (मुझे लगता है कि मैं वहां ग्लिब था) - मैंने तदनुसार पोस्ट संपादित किया है। – Boa

+0

जिज्ञासा से बाहर, क्या आप 'एनएनए' का उदाहरण दे सकते हैं? ऐसा इसलिए है कि हम अन्य प्रश्नों पर एनएलटीके में कुछ जांच कर सकते हैं, हालांकि इस प्रश्न से संबंधित नहीं है)। तकनीकी रूप से, इस टैगसेट के बाहर कोई टैग नहीं होना चाहिए: https://www.ling.upenn.edu/courses/Fall_2003/ling001/penn_treebank_pos।एचटीएमएल – alvas

2

आपका कोड नहीं अतिरेक है: आप फ़ाइल एक बार पढ़ सकते हैं और प्रत्येक वाक्य पर जाएँ, और प्रत्येक में चिह्नित शब्द, ठीक एक बार। कोई फर्क नहीं पड़ता कि आप अपना कोड कैसे लिखते हैं (उदाहरण के लिए, समझ का उपयोग करके), आप केवल नेस्टेड लूप छुपाएंगे, किसी भी प्रोसेसिंग को छोड़कर नहीं।

सुधार की एकमात्र संभावना इसकी अंतरिक्ष जटिलता में है: पूरी फ़ाइल को एक बार में पढ़ने के बजाय, आप इसे वृद्धि में पढ़ सकते हैं। लेकिन चूंकि आपको एक समय में पूरी वाक्य को संसाधित करने की आवश्यकता है, इसलिए यह एक समय में एक पंक्ति को पढ़ने और संसाधित करने जितना आसान नहीं है; इसलिए जब तक आपकी फाइलें पूरी गीगाबाइट लंबी नहीं होतीं तब तक मैं परेशान नहीं होता; छोटी फाइलों के लिए यह कोई फर्क नहीं पड़ता है।

संक्षेप में, आपके लूप ठीक हैं। आपके कोड में एक या दो चीजें हैं जिन्हें आप साफ़ कर सकते हैं (उदा। if खंड जो पीओएस टैग से मेल खाता है), लेकिन यह कुछ भी दक्षता के अनुसार नहीं बदला जा रहा है।

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