2016-09-06 3 views
1

Я хочу извлечь существительные из dataframe. Только существительные. я нижеКак извлечь существительные из dataframe

import pandas as pd 
import nltk 
from nltk.tag import pos_tag 
from nltk import word_tokenize 
df = pd.DataFrame({'noun': ['good day', 'good night']}) 

Я хочу, чтобы получить

noun 
0 day 
1 night 

Мой код

df['noun'] = df.apply(lambda row: nltk.word_tokenize(row['noun']), axis=1) 
noun=[] 
for index, row in df.iterrows(): 
    noun.append([word for word,pos in pos_tag(row) if pos == 'NN']) 
df['noun'] = noun 



--------------------------------------------------------------------------- 
AttributeError       Traceback (most recent call last) 
<ipython-input-194-688cfbb21ec5> in <module>() 
     1 noun=[] 
     2 for index, row in df.iterrows(): 
----> 3  noun.append([word for word,pos in pos_tag(row) if pos == 'NN']) 
     4 df['noun'] = noun 

C:\Users\Edward\Anaconda3\lib\site-packages\nltk\tag\__init__.py in pos_tag(tokens, tagset) 
    109  """ 
    110  tagger = PerceptronTagger() 
--> 111  return _pos_tag(tokens, tagset, tagger) 
    112 
    113 

C:\Users\Edward\Anaconda3\lib\site-packages\nltk\tag\__init__.py in _pos_tag(tokens, tagset, tagger) 
    80 
    81 def _pos_tag(tokens, tagset, tagger): 
---> 82  tagged_tokens = tagger.tag(tokens) 
    83  if tagset: 
    84   tagged_tokens = [(token, map_tag('en-ptb', tagset, tag)) for (token, tag) in tagged_tokens] 

C:\Users\Edward\Anaconda3\lib\site-packages\nltk\tag\perceptron.py in tag(self, tokens) 
    150   output = [] 
    151 
--> 152   context = self.START + [self.normalize(w) for w in tokens] + self.END 
    153   for i, word in enumerate(tokens): 
    154    tag = self.tagdict.get(word) 

C:\Users\Edward\Anaconda3\lib\site-packages\nltk\tag\perceptron.py in <listcomp>(.0) 
    150   output = [] 
    151 
--> 152   context = self.START + [self.normalize(w) for w in tokens] + self.END 
    153   for i, word in enumerate(tokens): 
    154    tag = self.tagdict.get(word) 

C:\Users\Edward\Anaconda3\lib\site-packages\nltk\tag\perceptron.py in normalize(self, word) 
    222   if '-' in word and word[0] != '-': 
    223    return '!HYPHEN' 
--> 224   elif word.isdigit() and len(word) == 4: 
    225    return '!YEAR' 
    226   elif word[0].isdigit(): 

AttributeError: 'list' object has no attribute 'isdigit' 

Пожалуйста, помогите, как это исправить? * Извините, у меня есть ro написать текст, чтобы я мог вставить все traceback Я предполагаю, что проблема в том, что я не могу преобразовать список в нужный формат?

+0

Просьба предоставить полный ответ. – albert

+1

Я не вижу нигде в вашем коде, где вы используете 'isdigit()'. Вы уверены, что разместили весь код? –

+0

@albert Я сделал это – Edward

ответ

1

Проблема в том, что в вашей петле row является pandas Series, а не списком. Вы можете получить доступ к списку слов, написав row[0] вместо:

>>> for index, row in df.iterrows(): 
>>>  noun.append([word for word,pos in pos_tag(row[0]) if pos == 'NN']) 
>>> print(noun) 
[['day'], ['night']] 

Здесь вы получаете список списков, каждый список, содержащий имена существительные из одного предложения. Если вам действительно нужен плоский список (как в ответе образца в ваш вопрос), напишите noun.extend(...) вместо noun.append.

Смежные вопросы