接着剤の精進日記

競プロでの精進や研究に関係したことを書いていきます。

論文メモ 「Deep Joint Entity Disambiguation with Local Neural Attention」

Deep Joint Entity Disambiguation with Local Neural Attention

Octavian-Eugen Ganea and Thomas Hofmann
Proceedings ofthe 2017 Conference on Empirical Methods in Natural Language Processing, pages 2619–2629 Copenhagen, Denmark, September 7–11, 2017.
https://www.aclweb.org/anthology/D17-1277

どんなもの?

文書レベルでのエンティティの曖昧性解消(entity disambiguation)のためのDeepLearningモデルを提案

DeepLearningの利点とgraphical models や probabilistic mention-entity mapsなどの伝統的なアプローチを組み合わせたもの

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

従来のEntity disambiguation(ED)システムは大部分が手動で設計されたfeaturesを使っている。
それらの基本的なfeaturesをディープラーニングを使うことでゼロから学ぶことで、広範なコーパスに頼る必要がない。
このようなアプローチは当時では初めてのアプローチ
そこそこのコストでSOTA(当時)やそれと同程度のaccuracyを達成

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

entity embedding、contextual attention mechanism、adaptive local score combination、unrolled differentiable message passing for global inferenceを組み合わせたEDのためのDeepLearning Architectureを提案

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

f:id:tkm-kyudo:20190528010240p:plainf:id:tkm-kyudo:20190528010245p:plain

議論はある?

f:id:tkm-kyudo:20190528010259p:plain
エラー分析:
(1)アノテーションエラー
(2)候補となるエンティティの集合に現れないgold entity
(3)p(e|m)が非常に低いgold entityで、優先度の高い誤ったエンティティ候補を持つ言及
(3)の例として、「Italian」という言及は国を意味するエンティティではなく、「イタリア代表フットボールチーム」を指す。
文脈情報はこのような間違いを回避するのに十分ではない。

次に読むべき論文は?

Ikuya Yamada, Hiroyuki Shindo, Hideaki Takeda, and Yoshiyasu Takefuji. 2016. Joint learning of the embedding of words and entities for named entity disambiguation. CoNLL 2016, page 250.

論文メモ 「複数言語複数タスクを扱う発話意図推定モデリングのための敵対的学習の検討」

複数言語複数タスクを扱う発話意図推定モデリングのための敵対的学習の検討

増村亮 篠原雄介 東中竜一郎 青野裕司
https://ipsj.ixsq.nii.ac.jp/ej/index.php?active_action=repository_view_main_item_detail&page_id=13&block_id=8&item_id=192747&item_no=1

どんなもの?

複数の言語データ,意図推定タスクのデータを用いてモデル化し(結合モデリング),各言語・タスクでの性能向上を狙う

特定の言語に依存しない結合モデリング, および,特定のタスクに依存しない結合モデリングを同時に実現するための敵対的学習手法を提案
→複数の言語・タスクでの性能向上を目指す

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

特定の言語や特定のタスクに共有ネットワークが依存してしまう問題を緩和し,各言語,各タスクにおける発話意図推定の性能向上を効率的に改善することを可能とした

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

複数言語複数タスクの結合ネットワークに,言語種別についての敵対的ネットワークとタスク種別についての敵対的なネットワークを組み合わせること

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

評価実験により,複数言語複数タスクを扱う結合モデリングに対して提案手法の敵対的学習を導入することが有効であることが示された

議論はある?

f:id:tkm-kyudo:20190514114404p:plain
(2)(4)は(1)より性能が劣化
→異なる言語間や異なるタスク間で共有するネットワークが,特定の言語やタスクに依存することに起因
(3)(5)は(2)(4)よりも性能改善
→敵対的学習が結合モデリングに有効

(6)複数言語、複数タスクについて結合モデリングを最尤基準で学習するのみでは不十分
(7)(8)言語種別/タスク種別についての敵対的ネットワークを導入し(6)よりも性能改善
(9)両者の敵対的ネットワークを併用することで最高性能
→複数言語複数タスクを同時に扱う場合には, 両者の敵対的ネットワークの併用が有効

次に読むべき論文は?

・Collobert, R. and Weston, J.: A unified architecture for nat- ural language processing: Deep neural networks with multi- task learning, In Proc. International Conference on Machine Learning (ICML) (2008)
・Liu, P., Qiu, X. and Huang, X.: Adversarial Multi-task Learn- ing for Text Classification, In Proc. Annual Meeting of the Association for Computational Linguistics (ACL), pp. 1–10 (2017).

論文メモ 「意味役割付与のためのスパン選択モデル」

意味役割付与のためのスパン選択モデル

大内 啓樹 進藤 裕之 松本 裕治
研究報告自然言語処理(NL),2018-NL-236(9),1-13 (2018-07-02) , 2188-8779
https://ipsj.ixsq.nii.ac.jp/ej/index.php?active_action=repository_view_main_item_detail&page_id=13&block_id=8&item_id=190362&item_no=1

どんなもの?

・スパン(フレーズ)選択に基づいた意味役割付与(SRL)モデルの提案
・意味役割付与 (Semantic Role Labeling; SRL) は,「いつ,どこで,誰が,何を,誰に,どうした」といった述語 と項の関係を同定する意味解析タスク
・可能な入力文のスパンをすべて考慮し、各意味役割ラベルに対するスコアを計算
・スパン特徴ベクトルに基づくアンサンブル法の提案

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

構文木などを用いずにすべての可能なスパンを考慮可能
・入力系列全体を考慮したスパンレベルの特徴量を使用可能
・ELMo を用いたアンサンブルスパンモデルがF1値87%でSOTAを2ポイント以上更新(英語意味役割付与タスク)

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

(1) 入力文の可能なスパンをすべて列挙する.(構文木を用いない)
(2) 列挙した各スパンにスコアをつける(bi-LSTMで入力文全体を考慮した特徴量)
(3) スコアのより高いスパンを出力する.
f:id:tkm-kyudo:20190509143417p:plain

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

BIO 型 SRL モデルとの比較に基づく,提案モデルの 長所・短所の定量的・定性的分析
f:id:tkm-kyudo:20190509143444p:plain

議論はある?

疑問
・スパン・CRF モデルのそれぞれの長所は何か?
・ELMo によって,意味役割付与のどのような側面が改善されたか?
発見
・CRFモデルがスパン境界同定精度が高いのに対しスパンモデルはラベル予測精度が高い
・ELMo はスパン境界の同定精度向上に大きく寄与している
f:id:tkm-kyudo:20190509143510p:plain
f:id:tkm-kyudo:20190509143513p:plain

次に読むべき論文は?

・ニューラルSRLモデル
He, L., Lee, K., Lewis, M. and Zettlemoyer, L.: Deep semantic role labeling: What works and what’s next, Proceedings of ACL, pp. 473–483 (2017).
・ラベル付きスパン予測
T¨ackstr¨om, O., Ganchev, K. and Das, D.: Efficient In- ference and Structured Learning for Semantic Role La- beling, Transactions of ACL, Vol. 3, pp. 29–41 (2015).

CentOS7にHDDを増設する

はじめに

今回はCentOS7にHDDを増設します。
2TB以上の場合領域を確保しないといけないらしく、そこで躓いたので備忘録として残しておきます。

環境

CentOS7
HDD 8TB

ディスク取り付け

増設したいHDDを取り付けCentOS7を起動します。
今回はrootで作業しました。
rootでなくてもsudoが使えれば問題ないと思います。

HDDの領域確保

2TBを超えるものは領域確保しないとだめみたいなので、それを行います。

# parted
# print all

print allで増設したいHDDのデバイス名を確認します。
私の場合は、/dev/sdb でした。

確認したデバイス名を選択します。

# select /sev/sdb

次にmklabelでラベル付けを行い、mkpartでパーテーション分けをします。
今回はディスク全体を1つのパーテーションとしています。

# mklabel gpt
# mkpart p 1M -1

最後にパーテーションの領域番号を確認しておきます。

# print

以下のように出るはずです。ここでは領域番号は1となっています。
f:id:tkm-kyudo:20190508173030p:plain

フォーマット

次にHDDをフォーマットしておきます。
先程の画像のファイルシステムext4の場合以下のコマンドでできます。
sdb○の部分は先程確認した領域番号を入れます。今回は1なのでsdb1をフォーマットします。

# mkfs.ext4 /dev/sdb1

xfsの場合だった場合は以下のコマンドでできるそうです。
領域番号はext4の場合と同様です。

# mkfs -t xfs -f /dev/sdb1

HDDのマウント

マウントするディレクトリを作成し、マウントをすればそのディレクトリで使えるようになります。
今回は/hddというディレクトリを作りましたが、名前は何でもいいと思います。

# mkdir /hdd
# mount /dev/sdb1 /hdd
# umount /hdd

起動時に自動でマウントする場合

起動時に自動でマウントしたい場合は/etc/fstabに追記するとできます。

#vi /etc/fstab

でファイルを開き一番下の行に次の一行を追加します。

/dev/sdb1 /hdd ext4 defaults 0 0

自動でマウントされるか確認

/etc/fstabに追加が終わったら、再起動を行い、マウントされているか確認します。

# reboot
# df -h

/dev/sdb1 が追加されていれば完了です。

日本語WordNetで上位語を取得する

はじめに

日本語版WordNetを使って上位語を取得したかったので、やります。

参考記事

以下の記事を参考にしています。
おおよそのプログラムは以下の記事のものを利用させてもらいました。
日本語WordNetを使って、上位語を検索できるツールをpythonで作ってみた - Qiita

WordNetのダウンロード

日本語 Wordnetのページに行き、
「Japanese Wordnet and English WordNet in an sqlite3 database」をダウンロードします。
適当なディレクトリを作り、そこにダウンロードしたものを解凍しましょう。
自分はjwordnetというディレクトリ名にしました。
解答するとwnjpn.dbというファイルができます。

上位語の取得

参考記事では最上位のものしか取得していなかったので、
ある概念の上位語をすべて取得するようにしました。
以下のプログラムでは、猫という単語の上位語をすべて取得しています。

import sqlite3
import sys
conn = sqlite3.connect("wnjpn.db")

# 上位-下位の関係にある概念の抽出
hierarchy_dict = {}  # key:上位語(String), value:下位語(List of String)
n_term_set = set()  # 下位語に含まれる単語集合

class node:
    def __init__(self, name, children=None):
        self.name = name  # String
        self.children = children  # List of Class node

    # 結果表示用
    def display(self, indent = 0):
        if self.children != None:
            print(' '*indent + self.name)
            for c in self.children:
                c.display(indent+1)
        else:
            print(' '*indent + self.name)

# 特定の単語を入力とした時に、上位語をすべて検索する関数
def SearchUpperConceptWords(word, hierarchy_dict):

    # 問い合わせしたい単語がWordnetに存在するか確認する
    cur = conn.execute("select wordid from word where lemma='%s'" % word)
    word_id = 99999999  #temp
    for row in cur:
        word_id = row[0]
    # Wordnetに存在する語であるかの判定
    if word_id==99999999:
        print("「%s」は、Wordnetに存在しない単語です。" % word)
        return
    else:
        print("【「%s」の上位概念を出力します】\n" % word)

    # 入力された単語を含む概念を検索する
    cur = conn.execute("select synset from sense where wordid='%s'" % word_id)
    synsets = []
    for row in cur:
        synsets.append(row[0])

    for synset in synsets:
        #上位語を取得する対象のsynsetを表示
        print('------------------%s---------------------'% synset_name_dict[synset])
        #現在のsynsetの上位語をすべて取得するため,tmp_synsetに代入
        tmp_synset=synset
        #synsetの上位語を最上位まで列挙する
        while(tmp_synset in hierarchy_dict.values()):
            #エラーが発生=最上位語を取得したら終了
            try:
                print(synset_name_dict[hierarchy_dict[tmp_synset]])
                tmp_synset = hierarchy_dict[tmp_synset]
            except:
                break

# 下位-上位の関係にある概念の抽出
cur = conn.execute("select synset1,synset2 from synlink where link='hypo'")

hierarchy_dict = {}  # key:下位語(String), value:上位語(String)

for row in cur:
    b_term = row[0]
    n_term = row[1]

    if n_term not in hierarchy_dict:
        hierarchy_dict[n_term] = b_term

# synset(概念)のIDから、概念の名称に変換する辞書の作成
synset_name_dict = {}  # key:synsetのID, value:synsetの名称
cur = conn.execute("select synset,name from synset")
for row in cur:
    synset_name_dict[row[0]] = row[1]

#猫という単語の上位語をすべて取得する
SearchUpperConceptWords("猫", hierarchy_dict)

結果は次のようになります。
f:id:tkm-kyudo:20190425113911p:plain

猫の上位語がfeline(ネコ科)、その上位語がcarnivore(有胎盤)、・・・のように取得した結果を表示しています。
SearchUpperConceptWords("猫", hierarchy_dict)の猫の部分を書き換えれば任意のものの上位語を取得できます。

おわりに

今回は日本語WordNetを使って、ある単語の上位語をすべて取得しました。
上位語を日本語で表示させるやり方は残念ながらわかりませんでしたが、WordNetのデーターベースに存在すれば上手く取って来ることは可能だと思います。気が向いたらやるかもしれないです。
今回のプログラムはgithubにも公開しています。
GitHub - EmulsionBondo/jwordnet: 日本語WordNetで上位語を取得する