GitHubじゃ!Pythonじゃ!

GitHubからPython関係の優良リポジトリを探したかったのじゃー、でも英語は出来ないから日本語で読むのじゃー、英語社会世知辛いのじゃー

facebookresearch

InferSent – NLIのためのセンテンス埋め込み(InferSent)とトレーニングコード

投稿日:

NLIのためのセンテンス埋め込み(InferSent)とトレーニングコード。

InferSent

InferSentは、英文の意味論的表現を提供する文章埋め込みメソッドです。 それは自然言語推論データに訓練され、多くの異なるタスクに一般化します。

私たちは、事前に訓練された英語センテンス・エンコーダに論文SentEval評価ツールキットを提供しています。

最近の変更点 :fastTextベクターで訓練されたinfersent2モデルが追加され、max-poolオプションが追加されました。

依存関係

このコードはPythonで書かれています。 依存関係は次のとおりです。

  • Python 2/3
  • Pytorch (最近のバージョン)
  • NLTK> = 3

データセットをダウンロード

SNLIとMultiNLIを取得するには、(データセット/で)次のように実行します。

./get_data.bash

SNLI / MultiNLIデータセットをダウンロードして前処理します。 MacOSの場合は、 unzipの代わりにp7zipを使用する必要があります。

GloVe (V1)またはfastText (V2)ベクターをダウンロードしてください

mkdir dataset/GloVe
curl -Lo dataset/GloVe/glove.840B.300d.zip http://nlp.stanford.edu/data/glove.840B.300d.zip
unzip dataset/GloVe/glove.840B.300d.zip -d dataset/GloVe/
mkdir dataset/fastText
curl -Lo dataset/fastText/crawl-300d-2M.vec.zip https://s3-us-west-1.amazonaws.com/fasttext-vectors/crawl-300d-2M.vec.zip
unzip dataset/fastText/crawl-300d-2M.vec.zip -d dataset/fastText/

文章のエンコーダを使用する

私たちは英語の文章をエンコードする簡単なインターフェースを提供します。 具体的な例については、 encoder / demo.ipynbを参照してください。 次の手順を開始します。

0.0)InferSentモデル(V1はGloVeでトレーニング、V2はfastTextでトレーニング)をダウンロードしてください[147MB]:

curl -Lo encoder/infersent1.pkl https://s3.amazonaws.com/senteval/infersent/infersent1.pkl
curl -Lo encoder/infersent2.pkl https://s3.amazonaws.com/senteval/infersent/infersent2.pkl

infersent1はGloVe(PTBトークナイザで前処理されたテキストで訓練されている)で訓練され、infersent2はfastText(MOSESトークナイザで事前処理されたテキストで訓練されている)で訓練されていることに注意してください。 後者は、バッチの外に文章を埋め込む際に不都合だったmax-poolingによるゼロの埋め込みも取り除きます。

0.1)次のコマンドを実行して、NLTKトークナイザがインストールされていることを確認します。

import nltk
nltk.download('punkt')

1) 事前に訓練されたモデルを (エンコーダ/に) ロードします

from models import InferSent
V = 2
MODEL_PATH = 'encoder/infersent%s.pkl' % V
params_model = {'bsize': 64, 'word_emb_dim': 300, 'enc_lstm_dim': 2048,
                'pool_type': 'max', 'dpout_model': 0.0, 'version': V}
infersent = InferSent(params_model)
infersent.load_state_dict(torch.load(MODEL_PATH))

2)モデルのワードベクトルパスを設定する:

W2V_PATH = 'fastText/crawl-300d-2M.vec'
infersent.set_w2v_path(W2V_PATH)

3)単語ベクトルの語彙を構築する(すなわち、必要なものだけを保持する)。

infersent.build_vocab(sentences, tokenize=True)

ここでn文のリストです。 infersent.update_vocab(文)を使用してボキャブラリを更新したり、 infersent.build_vocab_k_words(K = 100000)で K個の最も一般的な英語の単語を直接読み込むことができます。 tokenizeがTrue(デフォルト)の場合、文章はNTLKを使用してトークン化されます。

4)あなたの文章をエンコードする( n文章のリスト):

embeddings = infersent.encode(sentences, tokenize=True)

これは、次元4096の n個のベクトルを持つ数値配列を出力します。 単一のGPUでバッチサイズ128を使用して、速度は毎秒1000文程度です。

5)モデルが各単語に与える重要性を視覚化する:

文の符号化における各単語の重要性を視覚化する機能を提供します。

infersent.visualize('A man plays an instrument.', tokenize=True)

自然言語推論(SNLI)のトレインモデル

SNLIで結果を再現するには、 train_nli.pyにW2V_PATHを設定してから次のコマンドを実行します。

python train_nli.py

デフォルトの設定では、 開発者の正確度は85、テスト精度は84.5を取得する必要があります。

転送タスクでエンコーダを評価する

転送タスクのモデルを評価するには、 SentEvalを参照してください。 エンコーダのトレーニングに使用されているのと同じトークン化を選択することに注意してください。 ベースラインとInferSentモデルについて、次のテスト結果を取得する必要があります。

モデル CR サブ MPQA STS14 STSベンチマーク SICKの関連性 シックエンカウンター SST TREC MRPC
InferSent1 81.1 86.3 92.4 90.2 0.68 / .65 75.8 / 75.5 0.884 86.1 84.6 88.2 76.2 / 83.1
InferSent2 79.7 84.2 92.7 89.4 0.68 / .66 78.4 / 78.4 0.888 86.3 84.3 90.8 76.0 / 83.8
SkipThought 79.4 83.1 93.7 89.3 0.44 / .45 72.1 / 70.2 0.858 79.5 82.9 88.4
fastText-BoV 78.2 80.2 91.8 88.0 0.65 / .63 70.2 / 68.3 0.823 78.9 82.3 83.4 74.4 / 82.4

参照

このコードが有用であると判明した場合、 [1]を引用することを検討してください。

自然言語推論データ(EMNLP 2017)からのユニバーサルセンテンス表現の教師あり学習

[1] A. Conneau、D.Kiela、H. Schwenk、L. Barrault、A.Bordes、 自然言語推論データからのユニバーサルセンテンス表現の教師なし学習

@InProceedings{conneau-EtAl:2017:EMNLP2017,
  author    = {Conneau, Alexis  and  Kiela, Douwe  and  Schwenk, Holger  and  Barrault, Lo\"{i}c  and  Bordes, Antoine},
  title     = {Supervised Learning of Universal Sentence Representations from Natural Language Inference Data},
  booktitle = {Proceedings of the 2017 Conference on Empirical Methods in Natural Language Processing},
  month     = {September},
  year      = {2017},
  address   = {Copenhagen, Denmark},
  publisher = {Association for Computational Linguistics},
  pages     = {670--680},
  url       = {https://www.aclweb.org/anthology/D17-1070}
}

関連作業







-facebookresearch
-

執筆者:

facebookresearch

InferSent – NLIのためのセンテンス埋め込み(InferSent)とトレーニングコード

投稿日:

(さらに…)







-facebookresearch
-

執筆者: