MATLAB でのセンチメント分析
センチメント分析とは、文章中に表現されている意見や感情に基づいて、テキストを分類することです。センチメント分析モデルは、テキストに数値スコアを割り当て、そのセンチメントがポジティブかネガティブかを示します。
センチメント分析は、非常に幅広い業界で活用されています。ニュース記事やソーシャル メディアの更新情報などのテキストの集合に対し、センチメント スコアを使用して、そのテキストに表れている平均的なセンチメントを判断できます。センチメント分析は、価格予測や取引戦略の策定だけでなく、リスク解析、訴訟、経済学研究、健康研究、心理学など、さらに多くの分野で活用できます。
たとえば、センチメント分析モデルは "This product is great! #notsponsored" ("この商品は素晴らしい #広告ではありません") というテキストをポジティブとして分類し、"This product is so awful that I will boycott it" ("この製品はひどすぎるので不買運動をするつもりだ") というテキストをネガティブとして分類するかもしれません。
Text Analytics Toolbox™ は、センチメント分析のための組み込み関数を提供するだけでなく、より専門的な用途向けにカスタム モデルや辞書もサポートしています。例については、テキスト内のセンチメントの分析を参照してください。
VADER と比率センチメント スコア
MATLAB® では、組み込みのセンチメント分析関数である vaderSentimentScores または ratioSentimentScores を使用してテキストを解析できます。これらの関数は、VADER センチメント辞書によって与えられる複数の単語の組み合わせのセンチメント スコアに基づいて、文のセンチメント スコアを計算します。
tokenizedDocument を使用してテキストをトークン化し、トークン化された文書を vaderSentimentScores 関数または ratioSentimentScores 関数に渡します。
str = [
"The tea is delicious!"
"This other tea is awful."];
documents = tokenizedDocument(str);
vaderScores = vaderSentimentScores(documents)vaderScores = 2×1
0.6114
-0.4588スコアが 1 に近いほどポジティブ センチメントを示し、スコアが -1 に近いほどネガティブ センチメントを示し、スコアが 0 に近いほどニュートラル センチメントを示します。
vaderSentimentScores や ratioSentimentScores といったセンチメント分析アルゴリズムの多くは、1 つまたは複数の文のセンチメント スコアを、複数の単語の組み合わせのセンチメント スコアの関数として計算します。各単語のセンチメント スコアは、センチメント辞書によって提供されます。
vaderSentimentScores と ratioSentimentScores はどちらも、既定で VADER センチメント辞書を使用します。
VADER センチメント スコア
vaderSentimentScores 関数は、VADER アルゴリズムを使用してセンチメント スコアを計算し、-1 ~ 1 の範囲の実数を返します。
VADER アルゴリズムでは、増幅因子、減衰因子、否定因子を使用します。これにより、関数は "good" と "very good" に対して異なるスコアを割り当てることができます。
次のコードは、増幅因子、減衰因子、および否定因子の効果を示しています。
str = [
"This app is good."
"This app is very good." % sentence with booster
"This app is somewhat good." % sentence with dampener
"This app is not good."] % sentence with negator
documents = tokenizedDocument(str);
scores = vaderSentimentScores(documents)scores = 4×1
0.4404
0.4927
0.3832
-0.3412アルゴリズムは、句読点、大文字小文字の区別、繰り返しなどの追加情報も考慮に入れています。
str = [
"This app is good."
"This app is good!!!!!!" % sentence with punctuation
"This app is GOOD." % sentence with capitalization
"This app is good good good."]; % sentence with repetition
documents = tokenizedDocument(str);
scores = vaderSentimentScores(documents)scores = 4×1
0.4404
0.6209
0.5622
0.8271VADER アルゴリズムがスコアを正規化する方法の都合上、センチメントに関連する単語を多く含む長いテキストは、スコアが極端に高くなる、または極端に低くなる可能性があります。長い文書からより意味のあるスコアを得るには、それをより小さな文書 (たとえば複数の文の組み合わせ) に分割することができます。
str = [
"This app is good. It works really well. The design looks nice. I highly recommend it!"];
document = tokenizedDocument(str);
sentences = splitSentences(document);
documentScores = vaderSentimentScores(document)documentScores = 0.8801
sentenceScores = vaderSentimentScores(sentences)
sentenceScores = 4×1
0.4404
0.3384
0.4215
0.4740比率センチメント スコア
ratioSentimentScores 関数は、トークン化されたテキストのセンチメントを比率ルールを使用して評価します。各文書について、ネガティブ スコアに対するポジティブ スコアの比率が 1 より大きい場合、関数は 1 を返します。各文書について、ポジティブ スコアに対するネガティブ スコアの比率が 1 より大きい場合、関数は -1 を返します。それ以外の場合、関数は 0 を返します。取り得る 3 つの出力 (0、1、-1) は、それぞれニュートラル センチメント、ポジティブ センチメント、およびネガティブ センチメントに対応します。
str = [
"The tea is delicious!"
"This other tea is awful."];
documents = tokenizedDocument(str);
scores = ratioSentimentScores(documents)scores = 2×1
1
-1既定では、ポジティブおよびネガティブの絶対センチメント スコアが完全に一致するテキストのみがニュートラル (スコア 0) と評価されます。しきい値を手動で設定することで、ポジティブ センチメント スコアとネガティブ センチメント スコアが非常に近い (つまり、しきい値未満の係数の範囲内で等しい) 文書がニュートラルであると判定されるようにすることができます。
str = ["This third tea is delicious and awful." "This fourth tea is fantastic, it tastes amazing! But the cookies were bad."]; documents = tokenizedDocument(str); compoundScores = ratioSentimentScores(documents,Threshold=1.5)
compoundScores = 2×1
0
1特定の文書が中立と評価されるために必要なしきい値を確認するには、さまざまなしきい値に対して比率センチメント スコアを計算し、その結果をプロットします。この場合、ratioSentimentScores は "This third tea is delicious and awful." ("この 3 番目のお茶は美味しくて不味い") というフレーズを、ネガティブよりも約 1.35 倍ポジティブであると評価しています。
str = ["This third tea is delicious and awful."]; documents = tokenizedDocument(str); thresholds = 1:0.01:2; thresholdRatioScores = zeros(size(thresholds)); for i = 1:length(thresholds) thresholdRatioScores(i) = ratioSentimentScores(documents,Threshold=thresholds(i)); end plot(thresholds,thresholdRatioScores,".-") xlabel("Threshold") ylabel("Ratio Score")

カスタム センチメント辞書
センチメント辞書 (意見辞書とも呼ばれる) とは、センチメント スコアが付与された単語と n-gram のセットのことです。n-gram とは、アルゴリズムによって単一の単語として扱われる、単語、数字、および句読点のグループのことです。多くのセンチメント分析アルゴリズムは、ポジティブ センチメントとネガティブ センチメントを定義するために、センチメント辞書を利用しています。医療や金融などの特定の分野のテキストについては、データにより適した独自のセンチメント辞書を作成することができます。
vaderSentimentScores 関数と ratioSentimentScores 関数は VADER 辞書を使用しますが、より専門的な用途においては、データに適した独自のセンチメント辞書を作成することもできます。
センチメント辞書が有用であるためには、通常、豊富なボキャブラリを含んでいる必要があります。カスタム センチメント辞書を作成するために、自分のワークフローのコンテキストにおいてポジティブおよびネガティブな意味をもつ少数の単語から始めることができます。次に、単語埋め込みを使用し、埋め込み空間内での単語間の近接度に基づいて、その埋め込みに含まれる他の単語にセンチメント スコアを割り当てることができます。そのようにして、明示的に初期化した少数の単語のみに基づいた、完全なセンチメント辞書を作成します。
カスタム センチメント辞書を作成する方法の例については、Generate Domain Specific Sentiment Lexiconを参照してください。
サンプル ファイル "financeSentimentLexicon.csv" センチメント辞書を使用するには、readtable 関数を使って辞書を読み込みます。この金融センチメント辞書は、センチメント スコアが [-4, 4] の範囲に収まるように正規化されています。
filename = "financeSentimentLexicon.csv";
tbl = readtable(filename);
head(tbl)
Token SentimentScore
______________ ______________
{'innovative'} 4
{'greater' } 3.6216
{'efficiency'} 3.5971
{'enhance' } 3.5628
{'better' } 3.5532
{'creative' } 3.5358
{'strengthen'} 3.5161
{'improved' } 3.484 ヒント
VADER アルゴリズムには、多数のヒューリスティック定数と非線形性が含まれており、これは最大スコアが 4 であることを前提に最適化されています。最良の結果を得るには、カスタム センチメント辞書のスコアが [-4, 4] の範囲に正規化されていることを確認します。
カスタム辞書を使用して、VADER センチメント スコアを評価します。
str = "Innovative opportunities are good for success.";
documents = tokenizedDocument(str);
financialscores = vaderSentimentScores(documents,SentimentLexicon=tbl)financialscores = 0.9412
vaderSentimentScores 関数では、カスタムの減衰因子、増幅因子、および否定因子を使用することもできます。たとえば "kind of" というフレーズの n-gram をこのオプションで使用する場合、構成単語 ["kind" "of"] の行ベクトルとして n-gram を渡すことができます。構成単語の数が異なる複数のカスタム減衰因子を使用したい場合は、string 行列を渡すことができます。各行は、カスタムの減衰因子 (または増幅因子、または否定因子) に対応します。すべての行の要素数が同じになるように、短い n-gram を含む行を空の string で埋めて、string 行列が矩形になるようにします。
str = ["This is good." "This is relatively good." "This is kind of good."]; documents = tokenizedDocument(str); dampeners = [ "relatively" ""; "kind" "of"]; scores = vaderSentimentScores(documents,Dampeners=dampeners)
scores = 3×1
0.4404
0.3832
0.3832
カスタム センチメント辞書の生成
カスタム センチメント辞書を生成するには、単語埋め込みを使用できます。単語埋め込みは、単語と n-gram をベクトル空間にマッピングすることで、既存の機械学習アルゴリズムを用いてテキストを解析することを可能にします。
MATLAB で事前学習済みの単語埋め込みを使用するには、fastTextWordEmbedding 関数を使用できます。この関数には、Text Analytics Toolbox Model for fastText English 16 Billion Token Word Embedding サポート パッケージが必要です。このサポート パッケージがインストールされていない場合、関数によってダウンロード用リンクが表示されます。
センチメント分析を目的とした単語埋め込みの重要な特徴の一つは、単語間の距離という概念です。これは分野によって大きく異なる可能性があります。たとえば "product" という言葉は、コンテキストに応じて "manufacture"、"multiplication"、または "result" などの単語と関連付けられることがあります。
英語以外の言語でセンチメント分析を行う際、その言語の事前学習済みの単語埋め込みが利用できない場合は、独自の単語埋め込みを学習させることもできます。
特定の分野のカスタム単語埋め込みを生成する方法の例については、Generate Domain Specific Sentiment Lexiconを参照してください。
カスタム センチメント分析モデルの作成
VADER および比率センチメント分析アルゴリズムがワークフローに適さない場合は、文書分類手法を使用して独自のモデルを実装できます。独自のセンチメント分類器に学習させる方法の例については、センチメント分類器の学習を参照してください。
また、"positive" と "negative" というラベルが付いた学習文書を使用して、既存の文書分類ワークフローを活用することもできます。MATLAB での文書分類ワークフローの例については、分類用の単純なテキスト モデルの作成を参照してください。カスタム モデルを使用すると、"angry"、"sad"、"cheerful"、または "mischievous" など、2 つ以上のセンチメント カテゴリにデータを分類できます。
言語に関する考慮事項
ratioSentimentScores と vaderSentimentScores は英語のテキストのみをサポートしています。
tokenizedDocument および Text Analytics Toolbox の他の機能は、ドイツ語、日本語、韓国語などの他の言語もサポートしています。これら 3 つの言語のいずれかでセンチメント分析を実行するには、これらの関数を使用してセンチメント辞書をインポートまたは作成し、カスタム センチメント分析モデルを開発できます。カスタム センチメント分析モデルの作成方法を示す例については、センチメント分類器の学習を参照してください。
Text Analytics Toolbox での言語サポートの詳細については、言語に関する考慮事項を参照してください。
参考
tokenizedDocument | vaderSentimentScores | ratioSentimentScores