1. HOME
  2. ブログ
  3. Azure Machine Learning
  4. だれでも分かる機械学習(入門)第4回 Azure Machine Learning テキスト分析モデル

BLOG

ブログ

Azure Machine Learning

だれでも分かる機械学習(入門)第4回 Azure Machine Learning テキスト分析モデル

Azure Machine Learning テキスト分析モデル

 

 

 

テキスト分析とは

テキスト分析とは、文字列を対象としたデータマイニングのことである。通常の文章からなるデータを単語や文節で区切り、それらの出現の頻度や共出現の相関、出現傾向、時系列などを解析することで有用な情報を取り出す…

Wikipediaより

 

Azure Machine Learningを使って、テキスト分析モデルを構築することにより、ドキュメント分類やセンチメント分析を実施することが可能となります。

今回は、下記サイトを試行します。その上で独自の解説を加えてみました。

https://docs.microsoft.com/ja-jp/azure/machine-learning/studio/text-analytics-module-tutorial#step-1-clean-and-preprocess-text-dataset

 

 

 

第4回のゴール

サンプルモデルのゴールは、レビュー内容(英語)に対応するレビュースコアが高か低かのどちらになるか予測します。

今回は、2項分類予測モデルを構築します。

※ 次回は、日本語を形態素解析した上でテキスト分析を試みます。

 

[デプロイ後]

 

 

 

 

今回の手順について

  1. テキストデータセットをクレンジングする(Azure ML付属のBook Reviews from Amazonを使う)
  2. テキストから数値特徴ベクトルを抽出する
  3. 分類・回帰モデルをトレーニングする
  4. モデルスコアの確認と検証
  5. デプロイする

 

 

 

1.テキストデータのクレンジング

前処理・クレンジング

① まず、今回のデータセットの内容を確認してみる

確認するには、まず、実験キャンバス内に、Book Reviews Amazonをドラッグ&ドロップして配置してください。

その後、当該モジュールの下丸をクリック。Visualizeを選択すると下記のような画面が出現します。

Col1:レビュースコア

Col2:レビュー内容(テキスト)

Mean(算術平均)4.05

Median(中央値)5

Standard Devision(標準偏差)1.40

Missing Value(欠損値)0

ヒストグラムをみる限り、1,2あるいは4,5にデータが偏っております。

 

 

 

②  Edit Metadataを使ってレビュースコア列をカテゴリ化する

Edit Metadataを配置後、CategoricalをMake categoricalに変更してください。

今回は、レビュースコア(数値)をカテゴリデータ(質的データ)として使用します。

これにより、Col1が量的データから質的データへ変換されます。

 

 

 

③  Group Categorical Values モジュール使って2クラスに分類します

Col1をカテゴリ化するため、Selected Columns:を、Col1とします。

Inplace :既存の列の値を、下記で定義した新しいレベルで置き換えます

Default level name : low ※初期値をlowで設定

New number of levels :high ※もう一つをhighで設定

Name of new level1:high ※highの内訳は4,5。それ以外は、lowで設定。

これにより、log / high という2項分類となります。

 

 

ここまでの設定を確認するには、下方ツールバーのRUNを実行。

Group Categorical Valuesの①の部分をクリック→Visualizeをクリック

 

 

 

④  Preprocess Text モジュール使ってテキストクリーニングします

ここでは、Col2のテキストをクリーニングします。

クリーニングするためのオプションが多数用意されております。

[各オプションの説明]

Remove by part of speech品詞ごとに削除するかどうかを選択する:False:削除しない

Remove nouns:名詞を削除するには、このオプションを選択します。

Remove adjectives:形容詞を削除するには、このオプションを選択します。

Remove verbs:動詞を削除するには、このオプションを選択します。

 

その他のオプション:

Remove stop words

ストップワードを削除する。ストップワードとは自然言語を処理するにあたって一般的であるなどの理由で処理対象外とする単語

the , a など。

Lemmatization 単語を正規形で表現する
Detect sentences 文章を検出する
Normalize case to lowercase 小文字に正規化
Remove numbers 番号を削除する
Remove special characters 特殊文字を削除する
Remove duplicate characters 重複する文字を削除する
Remove email addresses メールアドレスを削除する
Remove URLs URLを削除する
Expand verb contractions 動詞の収縮を拡大する
Normalize backslashes to slashes バックスラッシュをスラッシュに正規化する
Split tokens on special characters 特殊文字のトークンを分割する

 

 

オプションを設定したあとにどうなるか、ここまでの設定をRUNをクリックして確認してみましょう。

RUN実行後、Preprocess Textモジュールの下丸をクリック、Visualizeしてください。

下記の通り、Col2 → Preprocessed Col2が…

大文字が小文字になり、また、ストップワードが削除されたことを確認できます。

 

 

 

2.テキストから数値特徴ベクトルを抽出する

Extra N-Gram Feature from text モジュールを使って数値特徴ベクトルを抽出します。

Selected columnsは、当然、正規化されたPreprocessed Col2を指定します。

先に、Split Dataで、0.8-0.2の割合でトレーニングデータとテストデータに分割します。

 

Ngramとは

「N文字インデックス法」「Nグラム法」などともいう。検索対象を単語単位ではなく文字単位で分解し、後続の N-1 文字を含めた状態で出現頻度を求める方法。Nの値が1なら「ユニグラム(uni-gram)」、2なら「バイグラム(bi-gram)」、3なら「トライグラム(tri-gram)」と呼ばれる。たとえば「全文検索技術」という文字列の場合、「全文」「文検」「検索」「索技」「技術」「術(終端)」と2文字ずつ分割して索引化を行ってやれば、検索漏れが生じず、辞書の必要も無い形態素解析によるわかち書きに比べると、2つの欠点がある。意図したものとは異なる検索結果(いわゆる検索ノイズ)の発生と、インデックスサイズの肥大化である。検索ノイズの一例として、「京都」で検索すると「東京都庁」という適合しない検索結果が返ってくる場合、「日本会議」と検索すると「n日本会議」までが拾い上げられるが挙げられる。

全文検索技術 Wikipediaより

コーパス(英: corpusとは

言語学において、自然言語処理の研究に用いるため、自然言語の文章を構造化し大規模に集積したもの。

コーパスとは Wikipediaより

 

 

Extract N-Gram Features from Text モジュールを使って、出現する単語辞書を作成します(のちに、N-Gram Feature from textというデータセットを作成)。そして、単語ごとの出現回数をカウントすることで数値的な特徴ベクトルを作成します。今回は、特徴ベクトルに単一の単語と後続の単語の2つの単語を組み合わせるため、N-Grams sizeに設定します。

K-Skip size

同じ辞書エントリの一部とみなす場合、どの範囲まで同じとみなすかを決めます。

例)K値:1 computer → conputer, compuuterは同じ辞書エントリーとする

Weighting function:[重み関数を選択 ]オプション *ここの説明は引用

  • Binary Weight:バイナリ・プレゼンス値を抽出されたnグラムに割り当てます。つまり、各nグラムの値は、指定されたドキュメントに存在する場合は1、そうでない場合は0です。
  • TF Weight:抽出されたnグラムに用語頻度スコア(TF)を割り当てます。各nグラムの値は、指定された文書の出現頻度です。
  • IDF Weight:抽出されたnグラムに逆文書頻度スコア(IDF)を割り当てます。各nグラムの値は、コーパス全体のコーパスの出現頻度で除算したコーパスサイズのログです。あれは:IDF = log of corpus_size / document_frequency
  • TF-IDF Weight:抽出されたnグラムにターム頻度/逆文書頻度スコア(TF / IDF)を割り当てます。各nグラムの値は、そのTFスコアにIDFスコアを掛けた値です。今回はこちらを使用します*TF-IDFの説明はこちらのサイトがわかりやすいです。
  • Graph Weight:TextRankグラフのランキングに基づいて、抽出されたnグラムにスコアを割り当てます。TextRankは、テキスト処理のためのグラフベースのランキングモデルです。グラフベースのランキングアルゴリズムは、本質的に、グローバル情報に基づいて重要度を決定する方法です。

Minimum word length:分析できる文字列の最小単語帳

Maximum word length:nグラム内の任意の単語で使用できる文字の最大数を入力します。

Minimum n-gram document absolute frequency:最小nグラム文書の絶対頻度については、nグラム辞書に含まれる単一の単語またはトークンに必要な最小の出現を示す数値を入力します。

たとえば、デフォルト値の5を使用する場合、nグラムまたはスキップグラムは、nグラム辞書に含めるコーパスに少なくとも5回表示する必要があります。

Maximum n-gram document ratio:各行に発生する単語はおおよそ、ドメイン由来の雑音単語でノイズとなります。これを削除する必要があります。ドメイン依存のノイズワードを除外するには、この比率を下げてみる。今回は、0.8で設定。

Detect out-of-vocabulary rows:「語彙外」(OOV)単語と呼ばれるn-gram語彙に含まれない語を含む行のインジケータを生成する場合は、[語彙外の行を検出する]オプションを選択します。

Mark begin-of-sentence:n-gram辞書に文の先頭を示す特殊文字列を追加するには、「文頭にマークを付ける」オプションを選択します。文章を特殊文字で始めるnグラムをプレフィックスすることは、テキスト分析では一般的であり、談話の境界を分析するのに役立ちます。 Azure ML Studioは記号|||を挿入します。カスタム文字は指定できません。

Normalize n-gram feature vectors:特徴ベクトルを正規化する場合は、[正規化nグラム特徴ベクトル]オプションを選択します。これを行うと、各nグラムの特徴ベクトルはそのL2ノルムで除算されます。
標準化はデフォルトで使用されます。

Use filter-based feature selection:テキストフィーチャベクトルのサイズを管理するための追加オプション

Feature scoring method:上記を選択している場合は、フィーチャスコアリング方法のドロップダウンリストからメソッドを選択する必要があります。

  • PearsonCorrelation:ラベル列値とテキストベクトルに基づいてPearsonの相関を計算します。
  • MutualInformation:ラベル列値とテキストベクトルに基づいて、相互情報スコアを計算します。
  • KendallCorrelation:ラベル列の値とテキストベクトルに基づいて、Kendallの相関を計算します。
  • SpearmanCorrelation:ラベル列の値とテキストベクトルに基づいてスピアマン相関を計算します。
  • ChiSquared:カイ二乗法を使用して、ラベル列値とテキストベクトルの間の相関を計算します。こちらを使用。
  • FisherScore:ラベル列値とテキストベクトルのFisherスコアを計算します。
  • Count-based feature selection:値のカウントに基づいて新しいフィーチャを作成します。このメソッドではラベル列は必要ありません。

Target column:今回、ラベル化するカラムを指定(正解となるカラムを指定する(今回はCol1を指定する))

Number of desired features:必要な機能の数 ※今回の参考モデルでは1000を指定しておきます。

 

 

ひとまず、ここまででRUNを実行しておきましょう。

例のごとく、Extract N-Gram Features from textの下丸をクリック、Visualizeで確認しておきましょう。

1000 + 5となっているのは、Col1 , Col2 , Preprocessed Col2, NumUniqueNgrams, NGramsStringというカラムが用意されているため。

 

 

 

 

3.分類、回帰モデルのトレーニング

データセットにはまだ前の段階からの文字列(Col2, Preprcecessed Col2, NumUniqueNgrams, NGramssString)があるため、データセット内の列選択を使って、 これらを除外します。

これにより、今回必要な、Col1とPreprocessed Col2.[xxx]だけが残ります。

 

 

除外結果が下記の通り。

 

 

 

この後、Two-Class Logistic Regression(2クラスのロジスティック回帰モジュール)を使ってレビュースコアの高低を予測するモデルを構築します。

Train Model では正解を与える必要があります

今回は、Col1となります。忘れないように必ず指定するようにしてください。

Score Model のAppend score columns to outputはオフにします。

 

 

 

4.モデルスコアの確認と検証

上記の学習済みモデルを、テストデータで検証するには少し工夫が必要です。

Split DataからScore Modelを直結した場合、Nグラムのボギャブラリ(単語辞書)それらの重み付けを使用することができません。

そこで下記の赤枠のように、Extract N-Gram Feature from text を設定します。

Vocabulary mode をそのまま継承する必要があるので ReadOnlyとしてください。

ボキャブラリのモード:読み取り専用(ReadOnly)に設定

頻度による N グラムのフィルタリング:最小値を 1 インスタンス

Maximum n-gram document ratioを、最大値 1に設定

特徴選択:False

 

 

 

さらに、Selct Columun in Datasetで、Col2, Preprocessed Col2, NumUniqueNgram, NgramStringを除外します。

実際に使うのは、Col1とPreprocessed Col2.[xxx] になります。

 

 

 

下記のように、Score Modelとつないだら、RUNを実行して検証

 

 

 

Two-Class Logistic Regression(二項分類モデル)をEvaluate Modelで評価してみる

https://docs.microsoft.com/ja-jp/azure/machine-learning/studio/evaluate-model-performance#evaluating-a-binary-classification-model

二項分類モデルで使用できる評価メトリックは、”精度“、”正確度“、”再現率“、”F1 スコア“、”AUC です。

さらに、このモジュールは、真陽性、偽陰性、偽陽性、真陰性の数を示す混同行列と “ROC“、”正確度/再現性“、”リフト” の曲線を出力します。

真陽性(True Positive:TP):59
偽陰性(False Negative:FN):339
偽陽性(False Positive:FP):22
真陰性(True Negative:TN):1580
正確さ(Accuracy):0.820
精度(Precision):0.728
想起(Recall):0.148
F1スコア(F1 Score):0.246
閾値(Threshold):0.5
AUC(AUC):0.812
ポジティブラベル:低い
ネガティブラベル:高い

 

①最初に精度を確認します。精度は、TP / (TP+FP)で求めます。

具体的にはその予測が正しく分類された割合を求めます。

59/(59+22)=0.728

 

②この分類モデルによって正しく分類された (TP) の割合をTP/(TP+FN) で求めます。

これを再現率(真陽性率)と呼びます。

59/(59+339)=0.148

 

精度と再現率はトレードオフの関係になっています。

たとえば、比較的バランスの取れたデータセットの場合、ほとんどを正の事例として予測する分類モデルは、再現率が高くなります。一方、負の事例の多くが間違って分類され、偽陽性の数が多くなるので、精度は低めになります。

 

③F1スコア

F1 = 2 (精度 x 再現率) / (精度 + 再現率)  *2 つのメトリックの調和平均

0.246 = 2(0.1077) / 0.876

 

④ROC曲線

この曲線が左上隅に近ければ近づくほど、分類モデルのパフォーマンスは良好と判断できます。

(つまり、真陽性率が高く、偽陽性率が低くなります)。

 

以上より、本モデルについての結果は利用可能といえそうです。

 

 

 

 (重要)N グラム ボキャブラリをデータセットとして保存

すべて整ったら、あらためてRUNを実行してください。

Finished runningが出たら、下記の通り、ReadOnlyであるExtract N-Gram Features from Textの右下の○をクリック。Save as Datasetをクリックして、Nグラムボキャブラリ(単語辞書)を保存してください。

名前は、N-Gram Features from Text としておきます。

 

データセットを保存後、Saved Datasetsへ下記のように保存されます。

 

実際の単語辞書(N-Gram Features from Text )の今回定義はこちら。

DFは、Document Frequencyです。

IDFは、Inverse Document Frequencyです。DFの対数をとります。*対数についてはこちら

 

 

5.デプロイ

SET UP WEB SERVICE をマウスオーバーし、Predictive Web Servcie[Recommended]をクリック。

そうすると、下記のようになります。

 

 

次に、先ほど保存したN-Gram Features from text データセット(単語辞書)を下記のようにキャンバス内に組み込んでください。

あわせて、Extract N-Gram Features from text の左端側のものを削除ください。

ReadOnlyのExtract N-Gram Features from textモジュールだけを残してProcess TextとN-Gram Features from text データセット(単語辞書)を繋いでください。

 

 

 

準備ができたら、そのあと、RUNを実行。

下記のように、Predictive experimentがFinished runningになればOK。

 

 

 

最後に、DEPLOY WEB SERVICE をそのままクリック。

そうすると下記の画面に自動で遷移します。

 

 

 Test previewをクリックして実際に検証してみる

上記の画面から、Test previewリンクをクリックしてください。

Col2に、検証したいテキストを入力。Test Request-Responseをクリック。

そうすると、Scored Labelsに、high / low のいずれかが判定されます。

これで、テキスト分析からhigh / low を判断可能となりました。

 

 

 

まとめ

今回は、Amazonのレビューテキストを使ってテキスト分析・二項分類予測を実施してみました。

参考サイトでは、Nグラムボキャブラリデータセットの説明が不十分なため、エラーがでます。

自己解決が必要です。この場合は、本ページをぜひ、参考にしてみてください。

日本語テキストの場合は、残念ながら、Azure Machine Learning単体では対応できません。

おそらく、R連携しながらRMecabを使って実施する必要がありそうです。

この辺りは、第5回でじっくり検証したいと思います。

皆さんも、ぜひ、Azure Machine Learningを使って、テキスト分析を試してみてください。

 

 

 

 

 

 

関連記事