自然言語処理APIの目的
SNSの投稿をなるべく簡単な情報に落とし込むことを目的にしました.
使った手法は,キーフレーズ抽出と文章のポジネガ判定を組み合わせています.
事前に用意したテンプレートに抽出したキーフレーズを組み合わせて投稿を簡単に変換しました.
処理の全体の流れ
- SNSの投稿を受け取る
- 投稿の不要な部分を削除する前処理を実行
- Natural Language APIIの感情分析とエンティティ感情分析を組み合わせて,投稿のキーフレーズを抽出する
- キーフレーズ抽出のライブラリpkeを使ってキーフレーズ抽出を行う
- 抽出したキーフレーズと事前に用意したテンプレートを組み合わせて,投稿内容を変換する
- 複数の変換候補が出るので,スコアをもとに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°を守るべし。です。
↓
変換後:
リンパっていいよね
変換前:
心理的安全性の話。
心理的安全性という言葉から表面的に捉えると、否定しないとか性善説に立つとかそういうことに捉えがちだが、挑戦しないことを許さない雰囲気を作る感覚の方が近い気がしています。
人と同じところで競争することを褒めず、人と違うことを考えることでの挑戦を徹底的に推奨することが大事かと思います。
↓
変換後:
心理的安全性...好き...