def 小児科医():

かけだし小児科医が仕事の合間にプログラミングを勉強するブログです。

自然言語処理の勉強をしてみる話。

前回結構苦労してMeCabをインストールした後の話。

defpediatric.hatenablog.com

 

自然言語処理を行うにあたって、文章を品詞分解する必要がある。

例を挙げると

コンビニの糖質〜%off商品は脂質が多いことがあるからダイエット時には注意

コンビニ/の/糖質/〜/%/off/商品/は/脂質/が/多い/こと/が/ある/から/ダイエット/時/には/注意

(多分)こんな感じ。

そのためのソフトウェアが「MeCab」である。

 

今回の目的は3人の作家の文章の特徴を見分けるモデルを作ること。

まずは青空文庫のtxtデータをMeCabで分断する。

 

その前にルビを消したりデータを整理していくのだが、今回はコードの説明はしないというかあんまりよくわかってないからできないというか、本買うかこちらのGithubをどうぞ。

github.com

 

 

次に作家の特徴と関係のない言葉(助詞や句読点など)を省いていく。

具体的には共通して頻出する言葉の上位を削除する感じ。

こういう言葉をストップワードというらしい。

 

整理された語句を使用して、

作家ごとの文章の出現語句から、特徴を決めていく。

具体的には作家ごとに頻出する語句は異なるので、それをベクトルとして表現する。

[犬 ; 猫 ; ハムスター]という軸で、出現頻度をベクトルにして[50 ; 100 ; 200]と書く感じ?(情弱で行列式をブログに書く方法が分からないのでこうやって書きます。3行1列のつもりです。)

実際には何万もの種類の言葉が出ているので、

[犬 ; 猫 ; ハムスター ; ライオン ; イグアナ ; …] みたいな何万次元の行列になると。

これをBag-of-Words(BoW)ベクトルというらしい。

 

このベクトルに重み付けベクトルWをつけて、特徴語を明らかにすると。

その方法として出てきたのが

TF-IDF(Term Frequency-Inverse Document Frequency;単語頻度-逆文書頻度)

これは文章全体がD個の文、N個の単語がある時、

ある単語tがn回存在するとき

TF = n/N      (単語の頻度)

単語tを含む文がD個ある時

IDF = -log10d/D (単語の珍しさ)

TF-IDF = n/N・log10D/d

 

んで、このあとロジスティック回帰でモデルを作るらしい。

が、ちょっとここ難しくて理解できてないのでまたこんど、、、