2020年11月17日火曜日

GiNZAを用いた自由回答データの可視化

GiNZAという日本語処理ツールを使うと,アンケートの自由回答みたいなものも簡単に可視化して示すことができるので助かる.たとえばこんな感じである(図).これはアンケートの結果で得られた自由回答から名詞句を抽出し,単語ベクトル化したうえでPCAをかけて低次元化し,2次元の図としてプロットしたものだ.

こうやって可視化すると,なんとなく傾向が見えてくる.図の下のほうにはキャンセルに関連した記述が現れているし,右のほうには会員登録や退会,会員制ウェブサイトの登録に関する話題が現れていることを確認できる.図の上のほうに現れている話題は組織や企業に関するもののようだ…… という具合.

元データはこんなデータである.あるアンケートの自由回答から名詞句を抽出したものだ(この抽出もGiNZAを使ってできるが,今回は割愛する).

広告プラットフォーマー

時間ロス

結局意味

ショッピングサイト

学生支援システムサイト

一定時間経過

最終登録

データ保存時

全て白紙

情報デザイン

行動経済学

全てキャンセル

全て返品

ソーシャル関連サービス

新機能追加

...

これ(たとえばkeywords.txtというファイルとする)を次のスクリプト(plot.pyとする)で処理(コマンドライン上で $ ./plot.py keywords.txt)すると,先の図が表示される,という仕掛け.インタラクティブに拡大して確認することもできるので,便利に使える.

#!/usr/bin/env python


import sys

import numpy as np

import matplotlib.pyplot as plt

from sklearn.decomposition import PCA

import spacy


from matplotlib import rcParams

rcParams['font.family'] = 'sans-serif'

rcParams['font.sans-serif'] = ['Hiragino Maru Gothic Pro'

    'Yu Gothic', 'Meirio', 'Takao', 'IPAexGothic', 'IPAPGothic'

    'VL PGothic', 'Noto Sans CJK JP']


nlp = spacy.load('ja_ginza')


with open(sys.argv[1]) as f:

  texts = [s.strip() for s in f.readlines()]


vectors = [nlp(t).vector for t in texts]


pca = PCA(n_components=2).fit(vectors)

trans = pca.fit_transform(vectors)

pc_ratio = pca.explained_variance_ratio_


plt.figure()

plt.scatter(trans[:,0], trans[:,1])


i = 0

for txt in texts:

  plt.text(trans[i,0]+0.02, trans[i,1]-0.02, txt)

  i += 1


plt.hlines(0, min(trans[:,0]), max(trans[:,0]), 

            linestyle='dashed', linewidth=1)

plt.vlines(0, min(trans[:,1]), max(trans[:,1]), 

            linestyle='dashed', linewidth=1)

plt.xlabel('PC1 ('+str(round(pc_ratio[0]*100,2))+'%)')

plt.ylabel('PC2 ('+str(round(pc_ratio[1]*100,2))+'%)')

plt.tight_layout()

plt.show()

※ 最後のプログラム部分は「【初心者向け】自然言語処理ツール「GiNZA」を用いた言語解析(形態素解析からベクトル化まで)」に記載されていたものを大いに参考にしました.ありがとうございます.

0 件のコメント:

コメントを投稿