Created
June 14, 2020 15:38
-
-
Save CookieBox26/83ad13bd1cde6555c3004cd9e7f95477 to your computer and use it in GitHub Desktop.
日本語の学習済み BERT モデルをインポートしてみる
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# 日本語の学習済み BERT モデルをインポートしてみる\n", | |
"\n", | |
"### 参考文献\n", | |
"- [GitHub - huggingface/transformers: 🤗Transformers: State-of-the-art Natural Language Processing for Pytorch and TensorFlow 2.0.](https://github.com/huggingface/transformers)\n", | |
" - PyTorch で BERT 等のNLPアーキテクチャが使用できるパッケージです。README の Installation にあるように pip でインストールすることもできるしソースコードからインストールすることもできます。\n", | |
" - [BERT — transformers 2.11.0 documentation](https://huggingface.co/transformers/model_doc/bert.html)\n", | |
" - README の Model architectures からリンクがあるように BERT のドキュメントです。class transformers.BertModel のところに BERT のモデルと対応するトークナイザを用意して文章を特徴ベクトル化する短いコード例があります。\n", | |
" - [[1810.04805] BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding](https://arxiv.org/abs/1810.04805)\n", | |
" - BERT のドキュメントからリンクがある BERT の原論文です。\n", | |
" - [Pretrained models — transformers 2.11.0 documentation](https://huggingface.co/transformers/pretrained_models.html)\n", | |
" - このドキュメントに transformers の学習済みモデル一覧があります。日本語の形態素レベルの系列に対するモデルは以下がありますが、トークナイザに MeCab が必要であるとあります。\n", | |
" - cl-tohoku/bert-base-japanese\n", | |
" - cl-tohoku/bert-base-japanese-whole-word-masking\n", | |
"- [MeCab: Yet Another Part-of-Speech and Morphological Analyzer](https://taku910.github.io/mecab/)\n", | |
" - MeCab です。\n", | |
"- [CentOSにmecabをインストールしました。 - Qiita](https://qiita.com/pugiemonn/items/e4e0c5c620566c45c3f0)\n", | |
" - CentOS に MeCab を入れるコマンドをまとめてくださっている記事です。\n", | |
"- [mecab-python3 · PyPI](https://pypi.org/project/mecab-python3/)\n", | |
" - mecab-python3 です。\n", | |
"- [cl-tohoku/bert-japanese: BERT models for Japanese text.](https://github.com/cl-tohoku/bert-japanese)\n", | |
" - 日本語 BERT モデルのリポジトリです。\n", | |
" - [bert-japanese/masked_lm_example.ipynb at master · cl-tohoku/bert-japanese](https://github.com/cl-tohoku/bert-japanese/blob/master/masked_lm_example.ipynb)\n", | |
" - 日本語 BERT モデルの読み込み&実行例です。" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### MeCab をインストールする\n", | |
"- [CentOSにmecabをインストールしました。 - Qiita](https://qiita.com/pugiemonn/items/e4e0c5c620566c45c3f0) にしたがって MeCab をインストールします。\n", | |
"- pip install mecab-python3 で mecab-python3 をインストールします。" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"正直\tショウジキ\t正直\t名詞-形容動詞語幹\t\t\n", | |
"、\t、\t、\t記号-読点\t\t\n", | |
"アイドル\tアイドル\tアイドル\t名詞-一般\t\t\n", | |
"なんて\tナンテ\tなんて\t助詞-副助詞\t\t\n", | |
"興味\tキョウミ\t興味\t名詞-一般\t\t\n", | |
"が\tガ\tが\t助詞-格助詞-一般\t\t\n", | |
"あり\tアリ\tある\t動詞-自立\t五段・ラ行\t連用形\n", | |
"ませ\tマセ\tます\t助動詞\t特殊・マス\t未然形\n", | |
"ん\tン\tん\t助動詞\t不変化型\t基本形\n", | |
"。\t。\t。\t名詞-サ変接続\t\t\n", | |
"EOS\n", | |
"\n" | |
] | |
} | |
], | |
"source": [ | |
"import MeCab\n", | |
"chasen = MeCab.Tagger(\"-Ochasen\")\n", | |
"print(chasen.parse(\"正直、アイドルなんて興味がありません。\"))" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### 日本語学習済みモデルと対応するトークナイザを読み込む\n", | |
"- 以下に倣っているだけです。モデル名には cl-tohoku を付けます。\n", | |
" - [bert-japanese/masked_lm_example.ipynb at master · cl-tohoku/bert-japanese](https://github.com/cl-tohoku/bert-japanese/blob/master/masked_lm_example.ipynb)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"◆ トークナイズ結果\n", | |
"torch.Size([1, 12])\n", | |
"tensor([[ 2, 21272, 6, 3527, 15060, 4878, 14, 130, 6769, 1058,\n", | |
" 8, 3]])\n", | |
"['[CLS]', '正直', '、', 'アイドル', 'なんて', '興味', 'が', 'あり', 'ませ', 'ん', '。', '[SEP]']\n" | |
] | |
} | |
], | |
"source": [ | |
"import torch\n", | |
"from transformers.tokenization_bert_japanese import BertJapaneseTokenizer\n", | |
"from transformers.modeling_bert import BertForMaskedLM\n", | |
"tokenizer = BertJapaneseTokenizer.from_pretrained('cl-tohoku/bert-base-japanese-whole-word-masking')\n", | |
"model = BertForMaskedLM.from_pretrained('cl-tohoku/bert-base-japanese-whole-word-masking')\n", | |
"\n", | |
"sentence = \"正直、アイドルなんて興味がありません。\"\n", | |
"input_ids = torch.tensor([tokenizer.encode(sentence, add_special_tokens=True)])\n", | |
"print('◆ トークナイズ結果')\n", | |
"print(input_ids.size())\n", | |
"print(input_ids)\n", | |
"print(tokenizer.convert_ids_to_tokens(input_ids[0].tolist()))" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### マスク箇所の単語を予測させる" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": { | |
"scrolled": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"◆ インプット(インデックス列)\n", | |
"torch.Size([1, 12])\n", | |
"tensor([[ 2, 21272, 6, 4, 15060, 4878, 14, 130, 6769, 1058,\n", | |
" 8, 3]])\n", | |
"['[CLS]', '正直', '、', '[MASK]', 'なんて', '興味', 'が', 'あり', 'ませ', 'ん', '。', '[SEP]']\n", | |
"\n", | |
"◆ マスクされているインデックス\n", | |
"3\n", | |
"\n", | |
"◆ 学習済みモデルによるマスク箇所の予測\n", | |
"[CLS] 正直 、 ゴルフ なんて 興味 が あり ませ ん 。 [SEP]\n", | |
"[CLS] 正直 、 野球 なんて 興味 が あり ませ ん 。 [SEP]\n", | |
"[CLS] 正直 、 競馬 なんて 興味 が あり ませ ん 。 [SEP]\n", | |
"[CLS] 正直 、 結婚 なんて 興味 が あり ませ ん 。 [SEP]\n", | |
"[CLS] 正直 、 プロレス なんて 興味 が あり ませ ん 。 [SEP]\n", | |
"[CLS] 正直 、 サッカー なんて 興味 が あり ませ ん 。 [SEP]\n", | |
"[CLS] 正直 、 スポーツ なんて 興味 が あり ませ ん 。 [SEP]\n", | |
"[CLS] 正直 、 麻雀 なんて 興味 が あり ませ ん 。 [SEP]\n", | |
"[CLS] 正直 、 お笑い なんて 興味 が あり ませ ん 。 [SEP]\n", | |
"[CLS] 正直 、 政治 なんて 興味 が あり ませ ん 。 [SEP]\n", | |
"[CLS] 正直 、 それ なんて 興味 が あり ませ ん 。 [SEP]\n", | |
"[CLS] 正直 、 パチンコ なんて 興味 が あり ませ ん 。 [SEP]\n", | |
"[CLS] 正直 、 声優 なんて 興味 が あり ませ ん 。 [SEP]\n", | |
"[CLS] 正直 、 ゲーム なんて 興味 が あり ませ ん 。 [SEP]\n", | |
"[CLS] 正直 、 これ なんて 興味 が あり ませ ん 。 [SEP]\n", | |
"[CLS] 正直 、 恋愛 なんて 興味 が あり ませ ん 。 [SEP]\n", | |
"[CLS] 正直 、 相撲 なんて 興味 が あり ませ ん 。 [SEP]\n", | |
"[CLS] 正直 、 将棋 なんて 興味 が あり ませ ん 。 [SEP]\n", | |
"[CLS] 正直 、 映画 なんて 興味 が あり ませ ん 。 [SEP]\n", | |
"[CLS] 正直 、 アイドル なんて 興味 が あり ませ ん 。 [SEP]\n" | |
] | |
} | |
], | |
"source": [ | |
"sentence = f\"正直、{tokenizer.mask_token}なんて興味がありません。\"\n", | |
"input_ids = torch.tensor([tokenizer.encode(sentence, add_special_tokens=True)])\n", | |
"\n", | |
"print('◆ インプット(インデックス列)')\n", | |
"print(input_ids.size())\n", | |
"print(input_ids)\n", | |
"print(tokenizer.convert_ids_to_tokens(input_ids[0].tolist()))\n", | |
"\n", | |
"masked_index = torch.where(input_ids == tokenizer.mask_token_id)[1].tolist()[0]\n", | |
"print('\\n◆ マスクされているインデックス')\n", | |
"print(masked_index)\n", | |
"\n", | |
"print('\\n◆ 学習済みモデルによるマスク箇所の予測')\n", | |
"result = model(input_ids)\n", | |
"pred_ids = result[0][:, masked_index].topk(20).indices.tolist()[0]\n", | |
"for pred_id in pred_ids:\n", | |
" output_ids = input_ids.tolist()[0]\n", | |
" output_ids[masked_index] = pred_id\n", | |
" print(tokenizer.decode(output_ids))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3", | |
"language": "python", | |
"name": "python3" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython3", | |
"version": "3.7.0" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment