2017-01-16 17 views
8

स्थितियों में, जहां आप पीओएस टैग करने के लिए इतने पर प्रति पंक्ति 1 वाक्य कार्यान्वयन के बहुमत के साथ एक पांडा dataframe में संग्रहीत पाठ का स्तंभ इच्छा में का उपयोग विधि लागूकैसे pos_tag_sents() पांडा dataframe को लागू करने के लिए कुशलतापूर्वक

dfData['POSTags']= dfData['SourceText'].apply(
       lamda row: [pos_tag(word_tokenize(row) for item in row]) 

एनएलटीके दस्तावेज recommends using the pos_tag_sents() एक से अधिक वाक्य के कुशल टैगिंग के लिए।

करता है कि इस उदाहरण के लिए लागू करते हैं और यदि ऐसा है तो कोड pos_tag_sents को pso_tag बदलते रूप में सरल किया जाएगा या NLTK पैराग्राफ

टिप्पणी pos_tag_sents() गुरू की लोडिंग को कम करना में उल्लेख किया है के पाठ सूत्रों का क्या मतलब है प्रत्येक बार लेकिन मुद्दा यह है कि यह कैसे करें और अभी भी एक पांडा डेटाफ्रेम में कॉलम तैयार करें?

Link to Sample Dataset 20kRows

+0

आपके पास कितनी पंक्तियां हैं? – alvas

+0

20,000 पंक्तियां पंक्तियों की संख्या – mobcdi

+0

यह कोई समस्या नहीं है। बस कॉलिंग की सूची के रूप में कॉलम निकालें, इसे संसाधित करें और फिर डेटाफ्रेम पर कॉलम में वापस जोड़ें। – alvas

उत्तर

5

इनपुट

$ cat test.csv 
ID,Task,label,Text 
1,Collect Information,no response,cozily married practical athletics Mr. Brown flat 
2,New Credit,no response,active married expensive soccer Mr. Chang flat 
3,Collect Information,response,healthy single expensive badminton Mrs. Green flat 
4,Collect Information,response,cozily married practical soccer Mr. Brown hierachical 
5,Collect Information,response,cozily single practical badminton Mr. Brown flat 

टी एल; डॉ

>>> from nltk import word_tokenize, pos_tag, pos_tag_sents 
>>> import pandas as pd 
>>> df = pd.read_csv('test.csv', sep=',') 
>>> df['Text'] 
0 cozily married practical athletics Mr. Brown flat 
1  active married expensive soccer Mr. Chang flat 
2 healthy single expensive badminton Mrs. Green ... 
3 cozily married practical soccer Mr. Brown hier... 
4  cozily single practical badminton Mr. Brown flat 
Name: Text, dtype: object 
>>> texts = df['Text'].tolist() 
>>> tagged_texts = pos_tag_sents(map(word_tokenize, texts)) 
>>> tagged_texts 
[[('cozily', 'RB'), ('married', 'JJ'), ('practical', 'JJ'), ('athletics', 'NNS'), ('Mr.', 'NNP'), ('Brown', 'NNP'), ('flat', 'JJ')], [('active', 'JJ'), ('married', 'VBD'), ('expensive', 'JJ'), ('soccer', 'NN'), ('Mr.', 'NNP'), ('Chang', 'NNP'), ('flat', 'JJ')], [('healthy', 'JJ'), ('single', 'JJ'), ('expensive', 'JJ'), ('badminton', 'NN'), ('Mrs.', 'NNP'), ('Green', 'NNP'), ('flat', 'JJ')], [('cozily', 'RB'), ('married', 'JJ'), ('practical', 'JJ'), ('soccer', 'NN'), ('Mr.', 'NNP'), ('Brown', 'NNP'), ('hierachical', 'JJ')], [('cozily', 'RB'), ('single', 'JJ'), ('practical', 'JJ'), ('badminton', 'NN'), ('Mr.', 'NNP'), ('Brown', 'NNP'), ('flat', 'JJ')]] 

>>> df['POS'] = tagged_texts 
>>> df 
    ID     Task  label \ 
0 1 Collect Information no response 
1 2   New Credit no response 
2 3 Collect Information  response 
3 4 Collect Information  response 
4 5 Collect Information  response 

               Text \ 
0 cozily married practical athletics Mr. Brown flat 
1  active married expensive soccer Mr. Chang flat 
2 healthy single expensive badminton Mrs. Green ... 
3 cozily married practical soccer Mr. Brown hier... 
4 cozily single practical badminton Mr. Brown flat 

               POS 
0 [(cozily, RB), (married, JJ), (practical, JJ),... 
1 [(active, JJ), (married, VBD), (expensive, JJ)... 
2 [(healthy, JJ), (single, JJ), (expensive, JJ),... 
3 [(cozily, RB), (married, JJ), (practical, JJ),... 
4 [(cozily, RB), (single, JJ), (practical, JJ), ... 

लांग में:

सबसे पहले, आप स्ट्रिंग की एक सूची के लिए Text स्तंभ निकाल सकते हैं:

texts = df['Text'].tolist() 

तो फिर तुम word_tokenize समारोह लागू कर सकते हैं:

map(word_tokenize, texts) 

ध्यान दें कि, @ बोउड का सुझाव लगभग df.apply:

का उपयोग करके लगभग वही है

तो फिर तुम स्ट्रिंग की सूची की एक सूची में tokenized पाठ डंप:

df['Text'].apply(word_tokenize).tolist() 

तो फिर तुम pos_tag_sents उपयोग कर सकते हैं:

pos_tag_sents(df['Text'].apply(word_tokenize).tolist()) 

तो फिर तुम स्तंभ वापस DataFrame में जोड़ें:

df['POS'] = pos_tag_sents(df['Text'].apply(word_tokenize).tolist()) 
2

प्रत्येक पंक्ति पर pos_tag को लागू करके, perceptron मॉडल हर बार लोड किया जाएगा (महंगा आपरेशन, के रूप में यह डिस्क से एक अचार पढ़ता है)।

यदि आप इसके बजाय सभी पंक्तियां प्राप्त करते हैं और उन्हें pos_tag_sents पर भेजते हैं (जो list(list(str)) लेता है), मॉडल एक बार लोड हो जाता है और सभी के लिए उपयोग किया जाता है।

source देखें।

+0

क्या आप 'pos_tag_sents() 'को पांडा डेटाफ्रेम कॉलम के साथ स्रोत और समग्र के रूप में उपयोग करने के लिए एक उदाहरण प्रदान करने में सक्षम होंगे गंतव्य ताकि वाक्य और टैग आउटपुट एक ही पंक्ति पर हो? – mobcdi

+0

मैं अंधेरे में छेड़छाड़ कर रहा हूं, क्योंकि मैं पांडस से परिचित नहीं हूं। हो सकता है कि कुछ pos_tag_sents (नक्शा (word_tokenize, dfData ['SourceText']। मान())) '। –

2

बजाय अपने नए कॉलम को यह असाइन:

dfData['POSTags'] = pos_tag_sents(dfData['SourceText'].apply(word_tokenize).tolist()) 
संबंधित मुद्दे