2016-04-01 13 views
3

stopwordsを削除した後にstemを削除しようとしているテキストファイルがありますが、実行しても何も変わっていないようです。私のファイルはdata0です。ここでステミング処理がPythonで動作しない

私のコードです:

## Removing stopwords and tokenizing by words (split each word) 
from nltk.corpus import stopwords 
from nltk.tokenize import word_tokenize 

data0 = word_tokenize(data0) 
data0 = ' '.join([word for word in data0 if word not in (stopwords.words('english'))]) 
print(data0) 

## Stemming the data 
from nltk.stem import PorterStemmer 

ps = PorterStemmer() 
data0 = ps.stem(data0) 
print(data0) 

そして、私は(読みやすくするためラップ)以下の取得:

私たちにとってアバディーン、質問 ``何石油産業を中心に? (イブニング・エクスプレス、10月26日)はデジャヴァーに触れます。その質問は、ほとんどの日に油が北海を汲み上げてからほとんど尋ねた。過去30年間で一定のサイクルアップが見られたが、ブームは業界を壊滅させる。私は次に起こることを予測する。そこでは、不確実性の長期的な心配があります。その後、上昇投資は雇用投資のオイルを参照してください、誰もが息を吸う救援クエストは、バーナーに戻る多様化。その落ち込み。主な産業は崩壊しやすい。国家の廃止された造船所は石炭産業を絶滅させている。それはパニックダウンダーズではなく不可欠で、賢明に将来の計画を立て始める。私たちの市民のビジネスリーダーは、絶えず安全な繁栄、すなわち観光、技術、バイオサイエンスの新興産業を探している必要があります。オイルローラーコースターがバッファーを叩くのを待って、経済的に強く待たなければなりません。 N JonesEllon

コードの最初の部分はうまく動作しますが(ストップワードとトークンの削除)、私たちは動作しない2番目の部分(ステム)です。どんな考え?

+0

、あなたの質問はあなたが得る出力で更新でした。それについて何が「うまくいかない?」 –

答えて

3

Stemmer docs http://www.nltk.org/howto/stem.htmlから、Stemmerは一度に1単語ずつ呼び出されるように設計されているようです。

[word for word in data0 if word not in (stopwords.words('english'))] 

すなわち、各単語の上にそれを実行してみてください参加する前に

など。

stemmed_list = [] 
for str in [word for word in data0 if word not in (stopwords.words('english'))]: 
    stemmed_list.append(ps.stem(str)) 

編集:コメントレスポンス。 私は次のように走った - そして正しくステムように見えた:

>>> from nltk.stem import PorterStemmer 
>>> ps = PorterStemmer() 
>>> data0 = '''<Your Data0 string>''' 
>>> words = data0.split(" ") 
>>> stemmed_words = map(ps.stem, words) 
>>> print(list(stemmed_words)) # list cast needed because of 'map' 
[..., 'industri', ..., 'diversifi'] 

私はテキストに直接適用することができステマーがあるとは思わないが、あなたは「PSを取り、独自の機能でそれをラップすることができます'とテキスト:

def my_stem(text, stemmer): 
    words = text.split(" ") 
    stemmed_words = map(stemmer, words) 
    result = " ".join(list(stemmed_words)) 
    return result 
+2

また、 '' data0'などの単語のための 'ps.stem(word)など – tripleee

+0

@Tom Rees、素晴らしいことは素晴らしいようですが、それでも私は同じ結果を与えているようです。 PorterStemmerは一度に1つの単語で呼び出されるように設計されているので、テキスト全体に適用できる他のステマー機能はありますか?ありがとう –

+0

@AndresAzqueta、私はあなたのコメントに応じて答えを編集しました。希望が役立ちます。 –

1

は、ここで私はNLTK/wが過去にやったものだ:

st = PorterStemmer() 

def stem_tokens(tokens): 
    for item in tokens: 
     yield st.stem(item) 

def go(text): 
    tokens = nltk.word_tokenize(text) 

    return ' '.join(stem_tokens(tokens)) 
関連する問題