blog

センチメント分析にAlinkを使うには?

センチメント分析とは、感情的な含みを持つ主観的なテキストを分析し、そのテキストの意見、好み、感情的な傾向を決定することです。この論文では、ホテルの顧客レビューのデータをモデル化し、モデルを通して予測を...

Jan 10, 2021 · 8 min. read
シェア

センチメント分析とは、感情的な含みを持つ主観的なテキストを分析し、テキストの意見、嗜好、感情的傾向を判断することです。この論文では、ホテルの顧客レビューのデータをモデル化し、モデルを通して予測を行います。曖昧性解消、テキストのベクトル化、モデル化、平易なベイズアプローチによる予測など、感情分析における一般的な操作のデモンストレーション。

使用したホテルレビューデータセットへのリンクは以下の通りです:

以下の分析とモデリングはAlinkを使用しています。

ピン留めしてAlink技術交流グループに参加しましょう。

Python バージョン・リンク解析の例

CsvSourceBatchOpを使用して、以下のコードでURLデータを読み込みます:

source = CsvSourceBatchOp()
.setFilePath('https://.com/SophonPlus/ChineseNlpCorpus/raw/master/datasets/ChnSentiCorp_htl_all/ChnSentiCorp_htl_.csv')
.setSchemaStr('label long, review string')
.setIgnoreFirstLine(True)

カラム名はラベルとレビュー、データ型は整数型と文字列型を設定し、1行目に保存されているCSVデータがカラム名であるため、1行目を無視してデータを読み込むように設定する必要があります。

以下では、データソースに問題がないかどうかを確認するために、印刷と表示を行う5つのデータを選択します:

source.firstN(5).print()

結果は以下の通り:

次に、以下のコードで、処理とモデリングプロセス全体をカプセル化するパイプラインを設定します:

pipeline = Pipeline(
 Imputer().setSelectedCols(["review"]).setOutputCols(["featureText"]).setStrategy("value").setFillValue("null"),
 Segment().setSelectedCol("featureText"),
 StopWordsRemover().setSelectedCol("featureText"),
 DocCountVectorizer().setFeatureType("TF").setSelectedCol("featureText").setOutputCol("featureVector"),
 LogisticRegression().setVectorCol("featureVector").setLabelCol("label").setPredictionCol("pred")
)

各アルゴリズム・コンポーネントの役割を説明してください:

  1. インピュータ:文字列値 "null "で "review "カラムを埋め、その結果を "featureText「カラムに書き込みます。

  2. セグメンテーション: セグメンテーション処理を実行します。つまり、元の文をスペースで区切られた 単語に分割します。入力結果カラムがないため、セグメンテーションの結果は入力カラムの値を直接置き換えます。

  3. StopWordsRemover: 分詞の結果から非活性化された単語を取り除きます。

  4. DocCountVectorizer:"featureText "列の単語を数え、計算されたTF値に従って、文をベクトルにマップし、ベクトルの長さは単語の数であり、"featureVector "列に保存します。

以下では、モデルの学習フェーズに入ることができます。Pipelineのfit()メソッドを使うと、以下のコードで変数modelと表記されたプロセス全体のモデルを取得することができます:

model = pipeline.fit(source)

モデルの transform() メソッドを呼び出すことで、モデルを使用してバッチ/ストリームデータに対して予測を行うことができます。

model.transform(source).select("pred", "label", "review").firstN(10).print()

走った結果は

Java バージョン・リンク解析の例

まず最初に、Alink Java プロジェクトが必要で、関連する環境を設定します。最も簡単な方法は、Alink のサンプルプロジェクトを使うことです。Alink のコードを git からダウンロードし、Jave IDE でプロジェクトを開くと、下図のように、すでに書かれた 3 つのサンプル: ALSExample, GBDTExample, KMeansExample を見ることができます。

com.alibaba.alinkパッケージの下に新しいJavaファイルを作成します。

package com.alibaba.alink;
public class SentimentHotelSimpleExample {
 public static void main(String[] args) throws Exception {
 }
 
}

CsvSourceBatchOpを使ってURLデータを読み込みます。カラム名をlabelとreviewに、データ型をintegerとstring型にそれぞれ設定します。このCSVデータの1行目はカラム名として保存されるので、データを読み込む際には1行目を無視するように設定する必要があります。

CsvSourceBatchOp source = new CsvSourceBatchOp()
 .setFilePath("https://.com/SophonPlus/ChineseNlpCorpus/raw/master/datasets"
 + "/ChnSentiCorp_htl_all/ChnSentiCorp_htl_all.csv")
 .setSchemaStr("label int, review string")
 .setIgnoreFirstLine(true)
source.firstN(5).print();

コードの最後の行は、5つのデータを選択して表示出力するもので、結果は以下の通りです:

label|review
-----|------
0|Ctripの注文には、「部屋の特徴:1つ1つ」と書かれている。.3*2,1枚のシート.1*2メートル、エキストラベッド不可 全室ブロードバンド無料”,部屋を見た後の実際の滞在は、私が今まで見た中で最も狭いスタンダードルームで、同じ大きさのベッドが2つあり、ベッドの両側が壁に寄りかかっていて、ちょっとした余分なスペースもなく、荷物を置く場所さえない。これはホテルによる詐欺なのか、Ctripによる詐欺なのか分からないので、補償を求めている。証拠が必要なら、実際の部屋の写真も持っている。また、台山からの旅行はやめた方がいい。ほぼ半数のホテルが不定期で予告なしの停電になる。
0|驚いたことに、シャワーにお湯が出ない!憂鬱だ。~~まだ山がある!しかしインターネット速度は問題ない~
0|私は要件に静かな部屋を希望すると書いた。私が6階に泊まった日、外の風がひどく吹き荒れ、寝付くのに1時間もかかるほどうるさかったことを誰が知っているだろうか。ホテルに部屋を変えてもらった。ホテルの周りには木がなく、どの部屋もとてもうるさいという。ここは敷地内なのか?次回からは、風が強くなったら泊まれないようだ。
0|長い時間をかけて評価を考えた結果、駅に超近いが、便利な反面、どうしても騒々しく感じてしまうことを思い出した。韓国や日本のツアー団体がよく泊まるが、フロントサービスが冷たい。スタンダードルームに2人で住み、ルームカードだけ渡してくれたが、非常に挑発的な視線も向けられた。ガスは気分ではない。17日のホテルのフィードバック:ホテルは、ゲストから提起された問題については、現在真剣に是正され、私は渤海パールホテルに滞在し、一人一人が滞在することを幸せになることを願って、満足して戻ってきた。
0|鉄道に隣接するホテル、夜間に火災が発生

次に、以下のコードで、処理とモデリングプロセス全体をカプセル化するパイプラインを設定します:

 Pipeline pipeline = new Pipeline(
 new Imputer()
 .setSelectedCols("review")
 .setOutputCols("featureText")
 .setStrategy("value")
 .setFillValue("null"),
 new Segment()
 .setSelectedCol("featureText"),
 new StopWordsRemover()
 .setSelectedCol("featureText"),
 new DocCountVectorizer()
 .setFeatureType("TF")
 .setSelectedCol("featureText")
 .setOutputCol("featureVector"),
 new LogisticRegression()
 .setVectorCol("featureVector")
 .setLabelCol("label")
 .setPredictionCol("pred")
 );

各アルゴリズム・コンポーネントの役割を説明してください:

  1. インピュータ:文字列値 "null "で "review "カラムを埋め、その結果を "featureText「カラムに書き込みます。

  2. セグメンテーション: セグメンテーション処理を実行します。つまり、元の文をスペースで区切られた 単語に分割します。入力結果カラムがないため、セグメンテーションの結果は入力カラムの値を直接置き換えます。

  3. StopWordsRemover: 分詞の結果から非活性化された単語を取り除きます。

  4. DocCountVectorizer:"featureText "列の単語を数え、計算されたTF値に従って、文をベクトルにマップし、ベクトルの長さは単語の数であり、"featureVector "列に保存します。

以下では、モデルの学習フェーズに入ることができます。Pipelineのfit()メソッドを使うと、変数modelと書かれたプロセス全体のモデルを以下のコードで取得できます:

 PipelineModel model = pipeline.fit(source);

モデルの transform() メソッドを呼び出すことで、モデルを使用してバッチ/ストリームデータに対して予測を行うことができます。

 model.transform(source)
 .select(new String[]{"pred","label","review"})
 .firstN(10)
 .print();

走った結果は

pred|label|review
----|-----|------
1|1|ホテルのサービスは本当に良かったし、部屋もきちんとしていた。バルコニーからは海が見えるし、海にはたくさんの船が停泊していて、とても気分がいい。朝食ビュッフェはとても美味しく、種類も豊富だった。
1|1|もともとバスルームに吊るされていた服を洗濯し、そのようにアウトとバックは、バルコニーにハングアップするラックを取っている!サービス態度は一流で満足している、すべての笑顔を見る!設備は老朽化しているが、部屋はきれいで満足!海が見えて安心感がある!満足
1|1|非常に良いロケーション、デラックスシービュールームに宿泊し、窓を開けると架け橋と海の景色を見ることができる。長い時間前にも住んでいたことを思い出し、現在は改装された。全体的に満足して、再び住んでいるだろう!
1|1|私はまた、最初の滞在のためにCtripのユーザーレビューを比較してシービューを選んだ。全体的な感じは非常によく、部屋のハードウェアは一般的だが、非常に清潔で、毎日フルーツやお菓子が無料であるだけでなく、人形を送信し、子供たちはそれが大好きだ。特筆すべきは、ホテルのサービスが非常に思いやりがあり、ケータリングやチャーターカーの価格も非常に公正で、ホテルで2回夕食を食べたが、非常に満足している、一人当たりの消費量は約30元である。一緒に行った友人も大満足で、次回威海へ行く時もシービューに泊まるつもりだ。補足レビュー29:ここのスタッフは丁寧で、国有企業としては本当に珍しい。例えば、朝食後にロビーのソファに座ったところ、ウェイターがすぐにお茶とタオルを送ってくれたり、1階の公共休憩スペースでトランプをしていたところ、ウェイターが暗くなるのを見計らって率先して電気をつけてくれたりした!......
1|1|今回もシービューガーデンホテルに宿泊したが、やはりフレンドリーな感じで、ホテルスタッフの熱意も衰えておらず、サービスも整っており、威海では他の4つ星ホテルにも何度か宿泊したことがあるが、サービスと比べると格が違い、シービューガーデンは本当に良いホテルで、次回も宿泊するつもりだ!.私はホテルの部屋のエアコンがあまりにも涼しくないという意見を提起したい、サービスは、これらの場所の欠陥に残すことができない、私は改善されることを望む!.
1|1|非常に良いサービスは、ホテルは4つ星に記載されているが、サービスは5つ星よりも悪くない、ホテル全体のウェイターは非常に熱狂的である、あなたが見る誰もがあなたに挨拶するためのイニシアチブを取るだろう、サービスの細部のホテルも非常によくやっているような:あなたはロビーに席を取る、ウェイターはすぐにお茶とタオルであなたを与えるだろう、ああ無料です。タクシーから降りると、ウェイターはすぐにあなたが乗っているタクシーのナンバーを書いたカードを渡してくれる。あえてデメリットを挙げるとすれば、ホテルのレストランは料理の提供が遅いことと、四川料理はシェフの腕が悪いので注文しないことだ。でも何があっても、次に威海へ行くときはあのホテルに泊まるつもりだ。
1|1|実に素晴らしい!朝食が豊富で、環境は良い、その価格、費用対効果の相対的である;簡単な食事の価格の一階のコーヒーバーは高くない、より良いの味は、部分が十分である、簡単な食事を解決するために、観光客の居住者と非居住者であるか、またはスナックとして良い選択である;スナックのホテルの建物は、より人気があり、より多くの品種、高品質である。そして、タイムリーな追加、子供たちに愛され、少し小さなベッドである。全体的に、全体的な感じは良いですが、滞在することをお勧めする。
1|1|便利な立地、安価、素晴らしいサービス、美しい環境!ありがとう!
1|1|私は塩城に行くたびにここに泊まるが、値段も安く、量も十分だ!
1|1|悪くないホテルで、食事も旅行もしやすい。サービスも良くなっている。
Read next

今日はReflectについて書いてみよう。

Reflectは、オブジェクトを操作するためにES6が提供する新しいAPIです。 2: いくつかのObjectメソッドの戻り結果をより合理的になるように変更します。 3: すべてのObject操作を関数の振る舞いに。 Proxyオブジェクトのメソッドであれば、Reflectオブジェクト上で対応するメソッドを見つけることができます。 ProxyはReflectオブジェクトの対応するパーティを簡単に呼び出すことができます。

Jan 10, 2021 · 4 min read