u++の備忘録

【論文メモ】同義語を考慮した日本語の単語分散表現の学習

論文名

田口雄哉, 田森秀明, 人見雄太, 西鳥羽二郎, 菊田洸: 同義語を考慮した日本語の単語分散表現の学習, 情報処理学会研究報告, Vol.2017-NL-233 No.17, 2017.

どんなもの?

訓練済みの単語分散表現を用い,同義語対を用いた日本語の単語分散表現の fine-tuning を行なう.単語分散表現の評価は,日本語の単語類似度データセットを用いて行った.実験の結果,同義語対を考慮した学習手法を適用することで,既存の単語の分散表現よりも質が改善することを確認した.

先行研究と比べてどこがすごい?

分布仮説にもとづいた学習を行なった場合,同義語や対義語に関わらず,同じ文脈に現れる単語は,似たようなベクトルになってしまうため,単語間の類似度を測る際に影響が出てしまう.その対策として,WordNet などの意味辞書から獲得した同義語対を用いて単語の分散表現を fine-tuning する手法が提案されているが,日本語での効果は報告されていない.

技術や手法のキモはどこ?

Faruqui ら [7] が提案している Retrofitting
Faruqui, M., Dodge, J., Jauhar, S. K., Dyer, C., Hovy, E. and Smith, N. A.: Retrofitting Word Vectors to Semantic Lexicons, Proceedings of the 2015 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies, Association for Computational Linguistics, pp. 1606–1615 (2015).

どうやって有効だと検証した?

データとして,Sakaizawa らが公開している日本語単語類似度データセット [19], [24] で評価を行なう.単語の分散表現は,公開されている日本語の訓練済み単語分散表現に加え,word2vec [13], [14] と Glove[17] を用いて実験を行なう.評価は,人手でアノテーションされた単語の類似度と,単語の分散表現を用いたコサイン類似度を,スピアマンの順位相関係数によって行なう.

議論はある?

副詞においては,自動で構築した同義語対を用いた場合,Skip-gram,Glove,そして fasttextにおいてスピアマンの順位相関係数が悪化している.理由としては,副詞の評価データの24語彙のうち,18 語彙が自動で構築した WordNet の同義語対に存在しているが,その中の 5 つの語彙全てがそれぞれの同義語対になっているため,どの単語もほぼ同じベクトルになってしまったことが原因と考えられる.

今後の課題は,Nikola ら [16] が提案している同義語と同時に対義語も考慮して単語の分散表現の Fine-tuning を行なうといった手法の適用が考えられる.しかし,日本語において,筆者らが知る限り,大規模な対義語対のデータは存在しない.そこで,今後は日本語の単語の分散表現を改善するために対義語データの構築を行なう.

次に読むべき論文は?

Faruqui, M., Dodge, J., Jauhar, S. K., Dyer, C., Hovy, E. and Smith, N. A.: Retrofitting Word Vectors to Semantic Lexicons, Proceedings of the 2015 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies, Association for Computational Linguistics, pp. 1606–1615 (2015).

【遊戯王デュエルリンクス】修正されたスキル「バランス」で50回戦った初期手札の分布 スクリーンショットからPythonで自動集計

11月6日のアップデートで、スキル「バランス」に一定のランダム性が付与されたそうです。どの程度のランダム性が付与されたかを調べるため、初期手札の分布を集計しました。

使用デッキ

f:id:upura:20171110075543p:plain
モンスター10枚・魔法5枚・罠5枚デッキで、スキルは「バランス」です。

集計方法

デュエルを始めた際の初期手札の画面でスクリーンショットを撮影し、下記のPythonスクリプトで自動集計しました。
upura.hatenablog.com

集計結果

f:id:upura:20171110080504p:plain
※ 0: モンスター, 1: 魔法, 2: 罠

修正前の効果だと、確定でモンスター2枚・魔法1枚・罠1枚になっていました。今回の調査で従来通りの配分になったのは36回(72%)で、以下のようなランダム性がありました。

  • モンスター2枚・魔法2枚……5回
  • モンスター3枚・魔法1枚……3回
  • モンスター3枚・罠1枚……3回
  • モンスター1枚・魔法2枚・罠1枚……3回

例えば、罠カードをデッキに5枚入れて「バランス」で初期手札に1枚入れようとするデッキの場合、今回の調査結果によると16%の可能性で失敗すると推定されます。

【Python&遊戯王デュエルリンクス】スクリーンショットから初期手札の「バランス」を自動取得するスクリプト

11月6日のアップデートで、スキル「バランス」に一定のランダム性が付与されたそうです。どの程度のランダム性が付与されたかを調べるため現在、モンスター10枚・魔法5枚・罠5枚デッキで「バランス」を使ってデュエルを始めた際の初期手札のスクリーンショットをひたすら取り続けています。

(オートで回している隙間時間を使って)その集計を簡略化するべく、スクリーンショットの画像から初期手札のモンスター・魔法・罠の割合を自動取得するプログラムを書きました。
github.com

手法

  1. 画像から、手札の1枚ずつの領域を取り出す
  2. それぞれの領域内のRGB値の平均を導出し特徴量とする
  3. 全てのデータ(特徴量+各ラベル)からKmeans法でモンスター・魔法・罠に分類する
  4. 集計して棒グラフを出力する
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os
import cv2
from sklearn.cluster import KMeans
from collections import Counter
import matplotlib.pyplot as plt
import numpy as np

img_dirs = ['img']
CARD_NUM = 4
CLASS_NUM = 3
img_data = []

def convertImgToRGB(img):
    for card in range(CARD_NUM):
        trim_img = img[1180:1200,(80 + 113 * card):(193 + 113 * card)]
        averages = trim_img.mean(0).mean(0)
        img_data.append(averages)

def imgImport():
    for i, d in enumerate(img_dirs):
        files = os.listdir('./'+d)    
        for f in files:
            img = cv2.imread('./' + d + '/' + f)
            convertImgToRGB(img)

def createBarplot(counter):
    labels = []
    cnts = []
    for label, cnt in counter.most_common():
        labels.append(label)
        cnts.append(cnt)
    left = np.array([(i+1) for i in range(len(cnts))])
    height = np.array(cnts)
    plt.bar(left, height, tick_label=labels, align="center")

def converRGBToCollection(img_data):
    pred = KMeans(n_clusters = CLASS_NUM).fit_predict(img_data)
    pred.resize(int(len(pred)/CARD_NUM), CARD_NUM)
    pred = list(pred)
    for i in range(len(pred)):
        pred[i].sort()
        pred[i] = str(pred[i])
    counter = Counter(pred)
    createBarplot(counter)

imgImport()
converRGBToCollection(img_data)

画像処理のイメージ

github.com

Kmeans法の結果

f:id:upura:20171110090559p:plain

from mpl_toolkits.mplot3d import Axes3D
def plotRGBVectors(img_data):
    pred = KMeans(n_clusters = CLASS_NUM).fit_predict(img_data)
    x = []
    y = []
    z = []
    for i in range(len(pred)):
        x.append(img_data[i][0])
        y.append(img_data[i][1])
        z.append(img_data[i][2])
    fig = plt.figure()
    ax = Axes3D(fig)
    ax.set_xlabel("X-axis")
    ax.set_ylabel("Y-axis")
    ax.set_zlabel("Z-axis")
    ax.set_xlim(0, 256)
    ax.set_ylim(0, 256)
    ax.set_zlim(0, 256)
    ax.scatter(x, y, z, "o", c=pred)
    plt.show()

plotRGBVectors(img_data)

スクリーンショット募集

データ量が大事なので、同条件でのスクリーンショットを下記フォルダにアップロードいただけると大変ありがたいです。
https://drive.google.com/drive/folders/1N4kV_Mu0qq--IEJO0EwoLKBk4ygD_r3M?usp=sharing

kmeansのinertiaとは何物か

暇だったのでkmeansのdocumentationを読んでいたら、今まで曖昧な理解だった"inertia"という語についてまとまった言及があったので、自分用メモ。

2.3. Clustering — scikit-learn 0.21.3 documentation

inertiaとは

kmeansの最適化において最小化すべき指標で、各クラスター内の二乗誤差のこと。

  • 凸面や等方性を想定しており、細長い集合などイレギュラーな構造が合わさった集合などを扱うのには向いていない
  • 正規化された指標ではないので「低い方が良く、0が最適」以上のことは言えない

inertiaの算出

ここでは、直接的な関数を使わずにinertiaを算出してみる。Jupyter notebookのコードはGithubで公開。

github.com

サンプル

下記記事の内容を利用。

qiita.com

f:id:upura:20171107113421p:plain

上記のようにクラスター分けされた集合でのinertiaを算出する。関数を用いると、以下の値が出る。

print ('Distortion: %.2f'% km.inertia_)
Distortion: 72.48

定義から計算

定義の通り、各クラスターごとの中心点との二乗誤差を足し上げる。関数を用いた結果と、ほぼほぼ一致した。

SSE = 0
for cluster in range(3):
    SSE += sum((km.cluster_centers_[cluster,0] - X[y_km==cluster,0])**2 + (km.cluster_centers_[cluster,1] - X[y_km==cluster,1])**2)
print(SSE)
72.47601671

【論文メモ】乗換案内データを用いた未来の混雑予測の研究

論文名

坪内孝太, 下坂正倫, 小西達也, 丸山三喜也, 山下達雄: 乗換案内データを用いた未来の混雑予測の研究, The 31st Annual Conference of the Japanese Society for Artificial Intelligence, 2017.
https://kaigi.org/jsai/webprogram/2017/paper-1107.html

どんなもの?

本研究はユーザの路線検索結果に着目することでユーザの予定情報を考慮しつつ、異常時の人口予測を可能にする手法を構築した.大規模なイベントであれば 1 週間前の時点からでも異常を予測できることを実験により確認した。

先行研究と比べてどこがすごい?

位置履歴データを用いて人口異常を検知する既存研究は多いが、数日前の時点から人口異常を「予測」する研究はなされていない。

技術や手法のキモはどこ?

Yahoo! JAPAN 経路検索のログデータを用いて、ユーザの予定情報を考慮した人口予測モデリングを実施。異常度を「乖離率」で判断する。

どうやって有効だと検証した?

  • イベントの有無によらず人口予測が可能であることを実験的に検証した.
  • 次に,SP と定常人口 DP とを比較することで,今まで為し得なかった 1 週間前の時点での異常予測が可能であることを示した.

議論はある?

  • 本研究では非常に簡単な式で「乖離率」を定義することで定量的な評価を行ったが,この判定基準をさらに洗練することで粒度の異なる異常予測が可能になると期待され,将来課題として考えられる.
  • また,大規模な異常混雑につながるようなイベントでは高い精度で検出できるが,異常の度合いが中規模(平常時の 5 倍程度)のイベントになると急に精度が低くなることも確認した.このようなケースにも対応できる工夫も将来課題の 1 つといえる.

次に読むべき論文は?

なし

【論文メモ】経済テキストデータを用いた極性概念辞書構築とその応用

論文名

伊藤友貴,坪内孝太,山下達雄,和泉潔: 経済テキストデータを用いた極性概念辞書構築とその応用, SIG-FIN-018, 2017.

どんなもの?

本研究では,極性概念辞書の構築手法を提案すると共にその有用性を検証した.まず,ヤフーファイナンス掲示板のテキスト情報,専門家によって与えられた約100単語の極性値,及び構造化されたニューラルネットワークモデルを用いて意味的にクラス分けされた極性概念辞書を作成した.その後,極性概念辞書を用いて経済動向の分析を試みた.

先行研究と比べてどこがすごい?

現状,単語単位での極性辞書自動構築に関する既存研究はあるものの,似たような意味の単語がひとまとまりになった形での極性辞書,極性概念辞書の構築に関する研究はほとんどされていない.

技術や手法のキモはどこ?

構造化されたニューラルネットワークモデルを用いた極性概念辞書の構築手法

どうやって有効だと検証した?

人工データを用いた単語へのポジネガ付与に関する実験
→ 極性伝播条件の妥当性を検証
→ 提案手法の性質を理論的に解析

実データを用いた極性伝搬の検証
→ 提案手法が市場動向分析において他の既存手法に比べ有用であることを実験的に示した

議論はある?

  • フレーズ単位での極性情報抽出手法の考案
  • 極性辞書の情報が少ない場合や少数のラベルつきデータしか手に入れられない状況でも安定的で高い予測精度を出すための改良法の開発
  • マルチタイプ極性概念辞書を用いた複種類のテキストデータの分析方法の開発

次に読むべき論文は?

なし