by 『前処理大全第11章』
文字を対象とした前処理、データ分析の手法
- 言語依存
- 非言語依存
- 言語依存
日本語や英語といった言語の種類により、前処理や分析の方法を変える。例えば、日本語の文章ならば形態素解析により品詞分解し、英語ならば、スペースを目印に分解する手法を用いる。また、文章に含まれる単語の種類によって文章の内容を分類する際に、英語の場合は、三人称単数(getとgetsなど)や過去形(getとgotなど)によって同じ単語の種類でも語尾が違うので、語尾をカットして語幹を取り出したり(gets -> get)、過去形を現在形に戻す(got -> get)前処理を行う。 - 非言語依存
言語の種類に左右されない前処理や分析(N-gramやRNNの利用など)。
非言語依存の方法は、言語が異なっても同じ方法を利用でき、前処理もほとんど必要なくとても便利。しかし、すべての傾向や特徴をデータから学ぶ必要があり、言語依存の方法と比較すると必要なデータ量が多くなる傾向がある。テキストデータを大量に保有していれば問題ないが、特定のサービスやビジネスにおける文章を対象にした分析の場合、十分なテキスト量を確保できないことが多い。このような時は、言語依存の方法が有効。
11-1 形態素解析による文章分解
例)名詞の抽出
『走れメロス』のテキストから、Mecabで形態素解析して名詞の単語を取り出す。
補足:google colabでの、Mecabのインストール
- MeCabなどのインストール
- MeCabの設定1:辞書をNEologdに変更
- MeCabの設定2:エラー対応
- 補:parse()の戻り値の中身 -> 文字列で返ってくる
11-2 単語の集合データに変換
形態素解析による単語への分解後の前処理。文章の語順を考慮する方法としない方法の2種類ある。
文章の語順を考慮する必要性は、後続の分析内容によって決まる。たとえば、文章の内容がポジティブ/ネガティブのどちらかを判定する場合は、語順を考慮する必要性が高い。「良い意味で期待を裏切られた」という文章に対して語順を考えず、含まれている単語のみから判定しようとすると「期待」、「裏切られた」といった単語からネガティブと判定してしまう危険がある。
一方、文章の内容を分類する場合は、語順を考慮する必要性が低い。「今日、本橋選手がロスタイムにゴールを決めました。」といったニュース文章の分類をしようとすると、「選手」、「ロスタイム」、「ゴール」といった単語からスポーツのニュースであると分類できる。
- 文章の語順を考慮する場合の前処理:構文解析
- これは、定義される文法に従って文の構造を明確にする前処理。GoogleのSyntaxNetなどのライブラリを用いて処理する。
- 文章の語順を考慮しない場合の前処理:bag of wordsへの変換
- これは、多次元の数値データとして扱えるので、クラスタリングなどの数値やカテゴリ値を対象にした手法を簡単に適用できる。
- bag of words:文章に含まれる単語の種類ごとの指標を数値化する前処理。
- bag of wordsの例
上記では、出現回数が数値化されているが、他にも文章内の単語の出現割合(=「対象の単語の数」÷「文章に含まれる単語の合計数」)や単語の出現有無(文章内に単語が出現しない場合は0、出現する場合は1)といった値を利用する前処理もある。
データの保持形式は、7-2でやったスパースマトリックスの形式が望ましい。なぜなら、文章数に対して単語の種類数は非常に多く、文章で何度も出現する単語はごく一部だから。
例)小説ファイル「走れメロス」「アグニの国」「トロッコ」別に、”名詞”の出現回数のbag of wordsを作成。
- Python
- 次元数減らすため、gensimを用いて縦持ち形式にする
- 結果
11-3 TF-IDFによる単語の重要度調整
単語の重要度とは、ある単語が文章の特徴づけにどの程度の影響力があるのかを表した値。TF-IDFでは、特定の文章にしか含まれておらず(IDFに該当)、対象の文章内で占める割合が高い単語ほど(TFに該当)、大きな値になるように調整される。
TFとは、Term Frequencyの略で、文章内の単語の出現割合(=「対象の単語の数」÷「文章に含まれる単語の合計数」)のこと。また、IDFとは、Inverse Document Frequencyの略で、全文章内の単語の出現割合によるスコア(=log(「全文書数」÷「対象の単語が出現している文書数」) + 1)のこと。
例として、以下の3つの文章
- 「明日 は 晴れ です」
- 「明日 は 雨 で 明後日 も 雨 です」
- 「今日 は 曇り です」
のなかで、「明日 は 雨 で 明後日 も 雨 です」の「明日」と「雨」「です」という単語の重要度を計算すると、
- 「明日」
TF: 1 / 8
IDF: log(3 / 2) + 1
TF-IDF: 1/8 * (log(3/2)+1) = 約0.147 - 「雨」
TF: 2 / 8
IDF: log(3 / 1) + 1
TF-IDF: 2/8 * (log(3/1)+1) = 約0.369
「です」
TF: 1 / 8
IDF: log(3 / 3) + 1
TF-IDF: 1/8 * (log(3/3)+1) = 0.125
「雨」という単語が、TFもIDFも高くなり、重要度が大きことがわかる。また、「明日」と「です」は、「明日 は 雨 で 明後日 も 雨 です」の中で同じ出現回数だが、全文章内の単語の出現割合が「明日」の方が低いため、「明日」の重要度が上がっていることがわかる。
注意点として、文章によって含まれる単語の数(文章の長さ)が大きく異なる場合は、文章間で単語の重要度のスケールを揃えるために、正規化を行う必要がある。正規化の方法としては、1文章に含まれる全単語のTF-IDFの2乗の合計値を1に揃えるL2ノルムがよく利用される。
例)TF-IDFを利用したbag of wordsの作成
小説ファイル「走れメロス」「アグニの国」「トロッコ」別に、各名詞のTF-IDFを計算する。さらに文章毎にL2ノルムによる正規化された値に変化させたbag of wordsを作成する。
- Python
- モジュール
- gensimでTF-IDFを計算
- 結果:各文章の単語(名詞)のTF-IDFが計算されている
0コメント