地平線まで行ってくる。

記録あるいは忘備録。時には検討事項。

文書を俯瞰 #2

自然言語処理。さてと、特許の分類に興味があったけれども、日本の特許庁は不便なんで、手に入るもので挑戦しようと調査中。

 

今回は、形態素解析。日本語を分解して単語に分ける。単語を単位とすれば処理ができるようになる。よく見かけるのはMeCabJanomeという形態素解析ライブラリ。巨大辞書Neologdが使えるMeCabは魅力的だが、今回は導入しやすいjanomeを採用。専門用語を考えると巨大辞書も魅力的だけれども事前検討してみるとjanomeのAnalyzerモジュールを活用すれば、そこそこいけそうな気がした。

 

この公式サイトや親切なサイトも参考にしつつ、テキスト前処理を組み立てる。先人の皆様ありがとうございます。

mocobeta.github.io

nanjamonja.net

qiita.com

 

そうして、「名詞」「動詞」の言葉だけを抜き出して、スペースで分けた分かち書きを実施する。

char_filters = [UnicodeNormalizeCharFilter(),
               RegexReplaceCharFilter(',', '、'),
               RegexReplaceCharFilter(r'[()::()]+', ' '),
               RegexReplaceCharFilter(r'[0-9]','')
               ]
tokenizer = Tokenizer()
token_filters = [CompoundNounFilter(),
                 POSKeepFilter(['名詞','動詞']),
                 POSStopFilter(["名詞,代名詞","名詞,非自立","名詞,数"]),
                 LowerCaseFilter()]
a = Analyzer(char_filters=char_filters,
             tokenizer=tokenizer,
             token_filters=token_filters)

wakati_list = []
# 形態素解析
for text in docs:
    word_list=[]
    [word_list.append(token.surface) for token in a.analyze(text)]
    wakati_list.append(" ".join(word_list))

# 分かち書き完成
wakati_list_np = np.array(wakati_list)
    

こんな感じになった。連ねる名詞を複合名詞として取り扱う様にし、数字や記号は多少省く。半角カンマも複合名詞に組みいられてカオスになったので、「、」=句点に変換することとした。

 

数字の取り扱い、は課題。「○○%含まれる」といったものも文章の特徴になるのだろう。何が○○%という関連付けが重要だろうし、言葉の係り受けといった高度な解析まで考え始めると手にあまるので先にすすめることにする。

 

続く・・・。