2016-01-14 13 views
6

मैं एक टर्म अजगर में दस्तावेज़ मैट्रिक्स कि अतिरिक्त डेटा के साथ एक साथ इस्तेमाल किया जा सकता का निर्माण करने के लिए एक प्रभावी तरीके के लिए देख रहा हूँ।अजगर पाठ प्रसंस्करण: NLTK और पांडा

मैं कुछ अन्य विशेषताओं के साथ कुछ पाठ डेटा है। मैं पाठ पर कुछ विश्लेषण चलाने के लिए चाहता हूं और मैं अन्य विशेषताओं के साथ टेक्स्ट से निकाले गए विशेषताओं (जैसे व्यक्तिगत शब्द टोकन या एलडीए विषयों) से संबंधित सहसंबंधों को सहसंबंधित करना चाहता हूं।

मेरे योजना एक पांडा डेटा फ्रेम के रूप में डेटा लोड और फिर प्रत्येक प्रतिक्रिया एक दस्तावेज का प्रतिनिधित्व करेंगी था। दुर्भाग्य से, मैं एक मुद्दा में भाग:

import pandas as pd 
import nltk 

pd.options.display.max_colwidth = 10000 

txt_data = pd.read_csv("data_file.csv",sep="|") 
txt = str(txt_data.comment) 
len(txt) 
Out[7]: 71581 

txt = nltk.word_tokenize(txt) 
txt = nltk.Text(txt) 
txt.count("the") 
Out[10]: 45 

txt_lines = [] 
f = open("txt_lines_only.txt") 
for line in f: 
    txt_lines.append(line) 

txt = str(txt_lines) 
len(txt) 
Out[14]: 1668813 

txt = nltk.word_tokenize(txt) 
txt = nltk.Text(txt) 
txt.count("the") 
Out[17]: 10086 

ध्यान दें कि दोनों ही मामलों में, पाठ इस तरह से संसाधित किया गया था कि केवल कुछ भी लेकिन रिक्त स्थान, पत्र और,।?! हटा दिया गया था (सादगी के लिए)।

आप देख सकते हैं एक पांडा क्षेत्र एक स्ट्रिंग में बदल कम मैचों वापस आती है और स्ट्रिंग की लंबाई भी कम है।

क्या उपर्युक्त कोड को बेहतर बनाने का कोई तरीका है?

इसके अलावा, str(x) टिप्पणियों में से 1 बड़ी स्ट्रिंग बनाता है जबकि [str(x) for x in txt_data.comment] एक सूची वस्तु बनाता है जिसे शब्दों के एक बैग में नहीं टूटा जा सकता है। nltk.Text ऑब्जेक्ट का उत्पादन करने का सबसे अच्छा तरीका क्या है जो दस्तावेज़ सूचकांक बनाए रखेगा? दूसरे शब्दों में, मैं tm पैकेज से TermDocumentMatrix() के टर्म डॉक्यूमेंट मैट्रिक्स, आर के बराबर बनाने का एक तरीका ढूंढ रहा हूं।

बहुत धन्यवाद।

+1

यकीन नहीं आपका प्रश्न क्या है, लेकिन उनमें से प्रत्येक अपने है अगर आप एक मृत अंत आप उन पुस्तकालयों भी कोशिश कर सकते हैं पर पहुंच गया, NLP के लिए अन्य पुस्तकालयों है कि आप के लिए सहायक हो सकता है, पैटर्न, textblob, सी और सी की तरह पुस्तकालय हैं, दूसरों पर अपना लाभ। – mid

+0

धन्यवाद @ मिड, मुझे जेन्सिम के बारे में पता है, लेकिन मैंने पहले कभी टेक्स्टब्लोब के बारे में नहीं सुना है, यह वास्तव में उपयोगी दिखता है! मैं पाइथन (मैं आम तौर पर आर में काम करता हूं) के लिए काफी नया हूं और मुझे सच में संदेह है कि मैं एनएलटीके के साथ एक मृत अंत तक पहुंच गया हूं, यह सोचकर कि पैकेज कितना लोकप्रिय है, मुझे यकीन है कि मुझे कुछ याद आ रहा है। – IVR

उत्तर

9

एक pandasDataFrame का उपयोग कर तो जैसे हर row को nltk कार्यक्षमता लागू करने के लिए किया जाएगा के लाभ: एक परिणाम के रूप

word_file = "/usr/share/dict/words" 
words = open(word_file).read().splitlines()[10:50] 
random_word_list = [[' '.join(np.random.choice(words, size=1000, replace=True))] for i in range(50)] 

df = pd.DataFrame(random_word_list, columns=['text']) 
df.head() 

               text 
0 Aaru Aaronic abandonable abandonedly abaction ... 
1 abampere abampere abacus aback abalone abactor... 
2 abaisance abalienate abandonedly abaff abacina... 
3 Ababdeh abalone abac abaiser abandonable abact... 
4 abandonable abandon aba abaiser abaft Abama ab... 

len(df) 

50 

txt = df.text.apply(word_tokenize) 
txt.head() 

0 [Aaru, Aaronic, abandonable, abandonedly, abac... 
1 [abampere, abampere, abacus, aback, abalone, a... 
2 [abaisance, abalienate, abandonedly, abaff, ab... 
3 [Ababdeh, abalone, abac, abaiser, abandonable,... 
4 [abandonable, abandon, aba, abaiser, abaft, Ab... 

txt.apply(len) 

0  1000 
1  1000 
2  1000 
3  1000 
4  1000 
.... 
44 1000 
45 1000 
46 1000 
47 1000 
48 1000 
49 1000 
Name: text, dtype: int64 

, आप प्रत्येक row प्रवेश के लिए .count():

txt = txt.apply(lambda x: nltk.Text(x).count('abac')) 
txt.head() 

0 27 
1 24 
2 17 
3 25 
4 32 

फिर आप का उपयोग कर परिणाम जोड़ सकते हैं:

txt.sum() 

1239 
+0

धन्यवाद @ स्टेफ़ान, जो कि मेरी समस्या का समाधान करता है, हालांकि 'txt' ऑब्जेक्ट अभी भी एक पांडा डेटा फ्रेम ऑब्जेक्ट है जिसका अर्थ है कि मैं केवल' लागू ',' मानचित्र 'या' लूप 'का उपयोग करके कुछ एनएलटीके कार्यों का उपयोग कर सकता हूं। हालांकि, अगर मैं कुछ करना चाहता हूं जैसे 'nltk.Text (txt) .concordance ("the")' मैं समस्याओं में भाग लेगा। इसे हल करने के लिए मुझे अभी भी पूरे पाठ चर को एक स्ट्रिंग में परिवर्तित करने की आवश्यकता होगी और जैसा कि हमने अपने पहले उदाहरण में देखा था, कि किसी कारण से स्ट्रिंग को छोटा कर दिया जाएगा। इस पर काबू पाने के बारे में कोई विचार? बहुत धन्यवाद! – IVR

+0

आप पूरे 'टेक्स्ट' कॉलम' को शब्दों की एक सूची में परिवर्तित कर सकते हैं: '[टी के लिए tf.text.tolist()]' - या तो सृजन के बाद या 'टोकननाइजेशन() 'के बाद। – Stefan

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