Pythonプログラミング:MeCabとnltkを使ったtokenization

nlp(natural language processing、自然言語処理)においては、入力データの前処理はかなり重要らしいので、そういうこともあって、テキストデータを適当に前処理してみた。preprocessing(前処理)するtext dataは、
text = “I was a fool.俺は馬鹿だった。It isn’t like you.君らしくない。”で、
この文章を、MeCabとnltkを使って単語ごとにtokenize(トークン化する)を試みた。

1
2
3
4
5
6
7
8
import MeCab
mecab = MeCab.Tagger ("-O wakati")
from nltk.tokenize import word_tokenize

text = "I was a fool.俺は馬鹿だった。It isn't like you.君らしくない。"
wakati = mecab.parse(text)
tokens = word_tokenize(wakati)
print(tokens)
['I', 'was', 'a', 'fool', '.', '俺', 'は', '馬鹿', 'だっ', 'た', '。', 'It', 'isn', "'", 't', 'like', 'you', '.', '君', 'らしく', 'ない', '。']

isn’tが”isn”, “t”になってしまっているので、まずはこれを何とかしたいと思いネットをあれこれ検索してみたところ、このサイトにあるcontractions moduleが目的にピッタリ合致しているので使わせてもらうことにした。contractions.pyをsite-packagesフォルダーに放り込んで準備完了、早速moduleをimportしてみた。

1
2
3
4
5
6
7
8
9
10
import MeCab
mecab = MeCab.Tagger ("-O wakati")
from nltk.tokenize import word_tokenize
from contractions import expandContractions

text = "I was a fool.俺は馬鹿だった。It isn't like you.君らしくない。"
text1 = expandContractions(text)
wakati = mecab.parse(text1)
tokens = word_tokenize(wakati)
print(tokens)
['I', 'was', 'a', 'fool', '.', '俺', 'は', '馬鹿', 'だっ', 'た', '。', 'It', 'is', 'not', 'like', 'you', '.', '君', 'らしく', 'ない', '。']

かなり見栄えが良くなったが、まだ、句読点やpunctuationsが邪魔なので、これらの不要物を取り除く必要がある。これは以下のようにすれば簡単に達成できる。

1
2
3
4
5
6
7
8
9
10
11
import MeCab
mecab = MeCab.Tagger ("-O wakati")
from nltk.tokenize import word_tokenize
from contractions import expandContractions

text = "I was a fool.俺は馬鹿だった。It isn't like you.君らしくない。"
text1 = expandContractions(text)
text2 = ''.join([i for i in text1 if i.isalpha() or i.isspace()])
wakati = mecab.parse(text2)
tokens = word_tokenize(wakati)
print(tokens)
['I', 'was', 'a', 'fool', '俺', 'は', '馬鹿', 'だっ', 'た', 'It', 'is', 'not', 'like', 'you', '君', 'らしく', 'ない']

isとかa等のstop words(ストップワード)が邪魔なのでこれを取り除きたい。nltkを使えばこの邪魔くさいストップワードは簡単に除去できる。ただ、nltkには日本語のストップワードが残念ながらないので、~/nltk_data/corpora/stopwordsにjapanese項目を作って、そのtext fileの中に適当に日本語のストップワードを放り込んでいく必要がある。日本語のストップワードのメジャーどころは、SlothLibらしいので、そこから思しき単語群を抽出するのも一つの手だろう。
最終的なtext preprocessing codeは以下のようなものになる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import MeCab
mecab = MeCab.Tagger ("-O wakati")
from nltk.tokenize import word_tokenize
from nltk.corpus import stopwords
from contractions import expandContractions

text = "I was a fool.俺は馬鹿だった。It isn't like you.君らしくない。"
text1 = expandContractions(text)
text2 = ''.join([i for i in text1 if i.isalpha() or i.isspace()])
wakati = mecab.parse(text2)
tokens = word_tokenize(wakati)
stopen = set(stopwords.words('english'))
stopja = set(stopwords.words('japanese'))
removed = []
for w in tokens:
    if w not in stopen:
        if w not in stopja:
            removed.append(w)
print(removed)
['I', 'fool', '馬鹿', 'It', 'like', '君']
参考サイトhttps://stackoverflow.com/
参考サイトhttps://github.com/

スポンサーリンク