2018年06月17日

言語処理100本ノックでPython入門 #52 - nltkでステミング

  
今日は、言語処理100本ノック 2015の第6章・問題52を解きます。

■ 問題
52. ステミング
51の出力を入力として受け取り,Porterのステミングアルゴリズムを適用し,単語と語幹をタブ区切り形式で出力せよ. Pythonでは,Porterのステミングアルゴリズムの実装としてstemmingモジュールを利用するとよい.

■ nltkライブラリのstemモジュールを使う


ステミングとは、単語の変化形の変化した部分を取り除く処理のことらしいです。

問題に、「stemmingモジュールを利用するとよい」とあるので、以下のようなコマンドを投入。
conda install stemming
でも、以下のエラーが出て見つかりません。
Solving environment: failed

PackagesNotFoundError: The following packages are not available from current channels:

  - stemming
そもそもこのstemmingライブラリは、python3.xに非対応らしいです。

python3.xで利用できるステミングモジュールはないかな、って調べたら、nltk というパッケージでstemmingができるらしいです。

僕が利用しているpythonのanacondaは、デフォルトでいろんなライブラリが入っているので、まずは、anacondaにあるかどうか調べます。
conda list
とやったら、
nltk                      3.2.2                    py36_0
と出てきました。これを使おうとおもいます。

from nltk import stem
で stem モジュールをimportします。

でも、pylintが以下のようなエラーを吐きます。
F0002:<class 'AttributeError'>: 'TreeRebuilder3k' object has no attribute 'visit_joinedstr'
どうも、pylintが古いみたいです。

無視してもいいのですが、せっかくなので、pylintを新しくします。
conda install -c anaconda pylint
無事、エラーが消えました。


では、stemを使って、Porterのステミングアルゴリズムで語幹を取り出します。
stemmer = stem.PorterStemmer()
stm = stemmer.stem(word)
とすれば、語幹が得られます。stemとは語幹という意味です。

ちなみに、
stemmer = stem.LancasterStemmer()
とすれば、LancasterStemmerという別のアルゴリズムも使えるみたいです。


■ Pythonのコード


以下、出来上がったPythonのコードを載せます。
from nltk import stem

def enumStem():
    stemmer = stem.PorterStemmer()
    #stemmer = stem.LancasterStemmer()
    with open('result51.txt', 'r', encoding='utf8') as fin:
        for line in fin:
            word = line.rstrip('\n')
            if word != '':
                yield word, stemmer.stem(word)

def main():
    with open('result52.txt', 'w', encoding='utf8') as w:
        for word, stm in enumStem():
            w.write(f'{word}\t{stm}\n')

if __name__ == '__main__':
    main()


ソースはGitHubでも公開しています。


そうだ、書き忘れていたけど、Pythonでも、C#の逐語的リテラル文字列のような書き方ができるようになったんですね。

f'{word}\t{stm}\n' 

便利になりました。


■ 結果
Natural	natur
language	languag
processing	process
From	from
Wikipedia	wikipedia
the	the
free	free
encyclopedia	encyclopedia
Natural	natur
language	languag
processing	process
NLP	nlp
is	is
a	a
field	field
of	of
computer	comput
science	scienc
artificial	artifici
intelligence	intellig
and	and
linguistics	linguist
concerned	concern
with	with
the	the
interactions	interact
between	between
computers	comput
and	and
human	human
... 以下省略