2016-09-06 14 views
1

データフレームから名詞を抽出します。名詞のみ。私が取得したいデータフレームから名詞を抽出する方法

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' 

、ヘルプは、どのようにそれを改善するためにしてください? *申し訳ありませんが、私はすべてのトレースバックを挿入できるようにいくつかのテキストを書いています 私はthrの問題は私が必要な形式にリストを変換できないと思いますか?

+0

完全なエラートレースバックを提供してください。 – albert

+1

あなたのコードのどこに 'isdigit()'を使っているのかわかりません。すべてのコードを投稿してもよろしいですか? –

+0

@albert私はそれをしました – Edward

答えて

1

問題は、ループではrowがリストではなくパンダ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.appendの代わりにnoun.extend(...)と書いてください。

関連する問題