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) |
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) |
かなり見栄えが良くなったが、まだ、句読点や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) |
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) |
参考サイトhttps://github.com/