Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

This article is a Private article. Only a writer and users who know the URL can access it.
Please change open range to public in publish setting if you want to share this article with other users.

More than 5 years have passed since last update.

HackDay2019に出場してSNSを薄めるChrome Extensionを作った話:自然言語処理API編

Last updated at Posted at 2019-12-29

自然言語処理APIの目的

SNSの投稿をなるべく簡単な情報に落とし込むことを目的にしました.
使った手法は,キーフレーズ抽出と文章のポジネガ判定を組み合わせています.
事前に用意したテンプレートに抽出したキーフレーズを組み合わせて投稿を簡単に変換しました.

処理の全体の流れ

  1. SNSの投稿を受け取る
  2. 投稿の不要な部分を削除する前処理を実行
  3. Natural Language APIIの感情分析とエンティティ感情分析を組み合わせて,投稿のキーフレーズを抽出する
  4. キーフレーズ抽出のライブラリpkeを使ってキーフレーズ抽出を行う
  5. 抽出したキーフレーズと事前に用意したテンプレートを組み合わせて,投稿内容を変換する
  6. 複数の変換候補が出るので,スコアをもとに1つを選択する

処理の詳細

ここから変換処理について詳しく説明します.
今回は,以下のSNS投稿を例として,それぞれの処理を実行します.

おはようございます🤗
手が冷たい午前5時
ハッシュタグで朝ランと打つと朝ラン久しぶりと予測変換
まあ当ってるから文句言えない
http://test.hogehoge.html

#朝ラン
#手が冷たい
#朝ラン久しぶり

前処理

SNSの投稿で不要な情報を削除する処理を行います
SNSの投稿には,絵文字,ハッシュタグ,URLなどの不要な情報が多く含まれています.
それをきれいにする処理を行っています.

おはようございます
手が冷たい午前5時
ハッシュタグで朝ランと打つと朝ラン久しぶりと予測変換
まあ当ってるから文句言えない

googleのAPIを使ったEntityの感情分析

今回はポジネガの判定のために,googleのNatural Language APIを利用しました.
Natural Language APIでは入力された文章全体の感情分析と文章中に含まれるエンティティ感情分析をすることができます.

  • 文章全体の感情分析の例
magnitude: 0.4000000059604645
score: 0.4000000059604645
  • エンティティ感情分析の例
entities {
  name: "朝ラン久しぶり"
  type: OTHER
  salience: 0.23296089470386505
  mentions {
    text {
      content: "朝ラン久しぶり"
      begin_offset: 47
    }
    type: PROPER
    sentiment {
    }
  }
  sentiment {
  }
}
・・・

pkeを使ったキーフレーズ抽出

キーフレーズの抽出にはNatural Language APIだけではなく,pkeと呼ばれるPythonのキーフレーズ抽出のライブラリを利用しています.
今回は検証する時間がなかったため,MultipartiteRankをデフォルト設定で利用しています.
pkeの使い方については,はじめての自然言語処理 第5回 pke によるキーフレーズ抽出を参考にさせていただきました.

[('冷たい 午前', 0.5), ('予測 変換', 0.5)]

キーフレーズの候補が複数抽出されるので,スコアが最も高いものを1つ選択するようにしました.
このフレーズが含まれる文を,すべて抜き出し,Natural Language APIへ送信し
抽出したキーフレーズが含まれる文章の感情値を分析します.

キーフレーズが含まれる投稿文: 手が冷たい午前5時
↓
score: 0.30000001192092896
magnitude: 0.30000001192092896
{"key": "冷たい 午前"}

キーフレーズとテンプレートの組み合わせ

抽出したキーフレーズと事前に用意したポジネガのテンプレートを組み合わせます.
テンプレートは3種類のものを用意しました.
また,より感情値に沿った変換を行うため,Natural Language APIで出力されるmagnitudeと呼ばれる感情の強度をもとに3種類のテンプレート("high", "mid", "low")を作ってそれと組み合わせるようにしています.

  • テンプレートの例
default_dic = {
    "positive": {
        "high": ["{} マジ最高…人生変わった", "{},まじさいこう。", "{}知らないのは人生半分損してる"],
        "mid": ["{}、ほんと大事。", "{}っていいよね", "{}好きだよ", "さすが{}"],
        "low": ["{}…好き…", "{}ってのもありかも", "あー、{}ね!"]
    },
・・・
}

変換候補の選択

Natural Language APIとPkeを使って3種類のテンプレートを得ることができました.
この3種類の中から適切なものを1つ選択します.
今回は,magnitudeの値をもとに重みを付けてランダムで1つ選択するようにしました.

 def choiceOne(self, sentence_dic):
    """
    magnitudeのスコアを重みとして,ランダムに選択する
    すべてのスコアが0のときはランダムに1つ選択する
    """
    d = [(v, v.magnitude_score) for k, v in sentence_dic.items()]
    a, w = zip(*d)
    if sum(w) == 0:
        print(w)
        return random.choice(a)
    else:
        w2 = np.array(w) / sum(w)
        v = np.random.choice(a, p=w2)
        return v

変換の例

今回の手法はキーフレーズ抽出と感情分析を組み合わせ,テンプレートと組み合わせただけですが,割とそれっぽい結果を出すことができました.
HackDayのスライドに使ったSNS投稿の変換例です.

変換前:
これが効果を示すのか分かんないですが,血液とかリンパの循環は大事ですよね。
椅子に座る時に,体幹と膝ももの角度が90°で座っているとやばいらしいです。
浅く腰掛けるか,ちゃんとした椅子に座って,110°を守るべし。です。

↓

変換後:
リンパっていいよね
変換前:
心理的安全性の話。
心理的安全性という言葉から表面的に捉えると、否定しないとか性善説に立つとかそういうことに捉えがちだが、挑戦しないことを許さない雰囲気を作る感覚の方が近い気がしています。
人と同じところで競争することを褒めず、人と違うことを考えることでの挑戦を徹底的に推奨することが大事かと思います。

↓

変換後:
心理的安全性...好き...
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?