slackの投稿を極性判定してみました
2021下期のEngineerChallengeWeekでは、「機械学習でテキストマイニング (コード、Doc、slack、その他)」をテーマに、テキストマイニングの学習に取り組みました。その中で行った極性判定について、書いてみたいと思います。
極性判定は、文書(text)が肯定的(positive)か否定的(negative)かを判定するタスクです。「ネガポジ判定」とも呼ばれます。文書を入力として、極性値を出力するような処理を極性判定処理といいます。一般的には、-nからnまでの値を取り、値が大きいほどポジティブになるような極性値(score)を設定します。
例えば、
「あのお店のケーキとても美味しかった 」 score:1 「転んで痛かった」 score:-2
というscoreが得られたとすると、「あのお店のケーキとても美味しかった 」はpositive、「転んで痛かった」はnegativeと解釈することができます。
参考図書を参考に、python3.7で実装しました。判定処理の構成は次のとおりです
クレンジング/クリーニングは、元のテキストから評価対象にしない部分を除去、または無効化します。SNSなどのやネット上のコミュニケーションツールの投稿データには、スタンプやメンションなどのコードが含まれています。それらのコードを評価対象に含める/含めないについては、ケースバイケースになるでしょう。
形態素解析は、解析するテキストに含まれる形態素を抽出します。極性辞書は形態素単位でマッチさせるので、形態素に分解しておきます。極性辞書は、東北大学旧乾・岡崎研究室(現在は乾・鈴木研究室)が提供している「日本語評価極性辞書 http://www.cl.ecei.tohoku.ac.jp/resources/sent_lex/wago.121808.pn」を利用します。
1 import sys
2 from numpy import append
3 import pandas as pd
4
5 lines = sys.stdin.readlines()
6
7 def make_dict():
8 wago = pd.read_csv('wago.121808.pn', header=None, sep='\t')
9 values = {'ポジ(経験)': 1, 'ポジ(評価)': 1, 'ネガ(経験)': -1, 'ネガ(評価)': -1}
10 word2score = {}
11 for word, label in zip(wago.loc[:, 1], wago.loc[:, 0]):
12 word2score[word] = values[label]
13 return word2score
14
15 # 各単語に対してスコアをとる
16 word2score = make_dict()
17 score = 0
18 scores = []
19 sentences = []
20 for line in lines:
21 line = line.strip()
22 print(line)
23 if line == '' :
24 continue
25 if line == 'EOF':
26 continue
27 if line.startswith('FILENAME\t'):
28 continue
29 if line.startswith('#'):
30 print(sentence)
31 continue
32 if line.startswith('S\t'):
33 sentence = line.split('\t')[1]
34 sentences.append(sentence)
35 continue
36 if line == 'EOS':
37 scores.append(score)
38 score = 0
39 continue
40 if line in word2score:
41 score += word2score[line]
42 continue
43
44 scores_df = pd.DataFrame({'sentence': sentences, 'score':scores}, columns=['sentence', 'score'])
45 scores_df_sorted = scores_df.sort_values('score', ascending=False)
46
48 print(scores_df_sorted)
MoTでは、slackを利用した社内コミュニケーションが盛んで、日々多数の投稿が書き込まれています。その中には、多くの人から所謂「いいね!」を貰った投稿があります。MoTそのような投稿を定期的に全社的に紹介する取り組みが行われています。今回、たくさんの「いいね!」を貰もらった投稿は、極性値が高い=肯定的である、という仮設を立て、そのような投稿について(勝手に)極性判定をしてみました。
対象の投稿は次表のとおりです。項番1が、上記「たくさんの「いいね!」を貰もらった投稿」です。項番2-4は比較対象のサンプルです。項番1と同じ日に投稿された投稿で、全社向けのチャネルをピックアップしました。ついでに、同日の所属チームの投稿も入れてみました(項番5)。
なお、解析対象のテキストには複数の文が含まれている場合がありましたが、極性評価は文単位に行いました。
評価値は-n<0<nの範囲(整数。値が大きいほど肯定的。0はどちらでもない)となるように設定しました。
項番 | 投稿概要 | 対象 | チャネル |
---|---|---|---|
❌ 未対応のtype(number)が見つかりました | 定例会のお知らせ | チーム | 所属チーム |
❌ 未対応のtype(number)が見つかりました | 資料確認の依頼 | 全社 | リリース |
❌ 未対応のtype(number)が見つかりました | ソフト・ハードの対応についてのお願い | 全社 | IT関連のお知らせ |
❌ 未対応のtype(number)が見つかりました | 定例会のお知らせ | 全社 | 全社定例会 |
❌ 未対応のtype(number)が見つかりました | CX体験会のお知らせ(<-たくさんの「いいね!」を貰もらった投稿) | 全社 | いいね! |
極性判定の結果、肯定的な判定結果を得た文は2件ありました。CX体験会のお知らせ(<-「たくさんの「いいね!」を貰もらった投稿」)が含まれていました。また、同スコアで「ソフト・ハードの対応についてのお願い」の投稿も肯定的な判定結果になりました。否定的な判定結果を得た文は0件で、その他の文は全て極性値が0でした。
項番 | 極性値 | 肯定的なテキストが含まれていた投稿概要 |
---|---|---|
❌ 未対応のtype(number)が見つかりました | ❌ 未対応のtype(number)が見つかりました | CX体験会のお知らせ(<-たくさんの「いいね!」を貰もらった投稿) |
❌ 未対応のtype(number)が見つかりました | ❌ 未対応のtype(number)が見つかりました | ソフト・ハードの対応についてのお願い |
「たくさんの「いいね!」を貰もらった投稿」は、文そのものが肯定的との判定結果が得られました。人のアクションである「いいね!」と、定量的な評価結果が一致すると安心感があります。肯定的な文は共感を得やすいのかもしれません。
もうひとつの「ソフト・ハードの対応についてのお願い」の文は、意外な結果でした。個人的には、お願いごとというのは、お願いされる側は感覚的に否定的になりやすいんじゃないかという印象があるからです。平たく言うとは「めんどくせー」です。しかし、この文自体は、依頼文面の末尾の「・・・・よろしくお願いします。」に当たる一文で、依頼内容については含まれていません。「めんどくせー」という評価は、文あるいは単語そのものの評価ではなく、受け取る側のその後のアクションや推移に対する評価なのでしょうか。
否定的な判定結果を得た文は0件でした。きっと否定的な文言を避けて投稿しているのでしょう。
その他の文は全て極性値が0でした。業務上は、肯定的でも否定的でもない、中立的な文言が多いのかもしれません。
以上が、2021下期のEngineerChallengeWeekで行った極性判定の、学習内容と実際にやってみた内容と結果です。極性判定では、文書が肯定的か否定的かを判定します。極性判定の処理をプログラムにして、社内コミュニケーションの一場面で行われている投稿の極性判定を行いました。中立的な文言が多い社内コミュニケーションにおいて、肯定的な文が出てくるのは、やはり社内的にも「いいね!」と思わせるような出来事なのでしょう。
興味のある方は 採用ページ も見ていただけると嬉しいです。
Twitter @mot_techtalk のフォローもよろしくお願いします!