こんにちは!
消費財メーカーでデジタルマーケター・データサイエンティストをやっているウマたん(@statistics1012)です!
データサイエンティストとしてもブロガーとしても気になるBERT!
より文脈をAIが理解できるようになったBERTというロジックにデータサイエンス的な観点とSEO的な観点で踏み込んでいきたいと思います。
目次
BERTとは

BERTとは「Bidirectional Encoder Representations from Transformers」の略であり、Googleが新たに開発した自然言語処理のロジックになります。
Googleは2018年10月11日に論文を公開し、Google検索のアルゴリズムに2019年10月25日に適応しました。
そして日本語のGoogleへのアップデート適応は2019年12月となっています。
BERTの登場によりGoogleはより長く複雑な文章を理解できるようになり、文脈を読み取ることができるようになりました。
実際にGoogleのリリースにBERT導入前と導入後のGoogle検索の違いが記載されています。
(引用元:Google-”Understanding searches better than ever before”)
ブラジル人が米国へ渡航する際のビザの有無を知りたいのですが、BERT実装前は英文における”to”の意味を明確に捉えることができずアメリカ人がブラジルへ旅行する場合の結果を返していました(左側)。
BERT実装後は、しっかりアメリカ渡航の際の結果を返すことができています。
このように検索結果が、より検索者の検索意図を読み取れるように進化してきているのです。
BERTのアルゴリズム

そんなBERTはどのようなアルゴリズムなのでしょうか?
2018年10月にGoogleからリリースされた論文にはこのように記載されています。
BERT is conceptually simple and empirically powerful. It obtains new state-of-the-art results on eleven natural language processing tasks
(引用元:Google-“BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding”)
BERTはシンプルでありながら非常に強力で一般的な11つの言語処理指標において優位な結果を収めたと・・
実はBERTは事前学習モデルであり他の既存モデルと組み合わせることで効果を発揮するものなんです。
BERTとは「Bidirectional Encoder Representations from Transformers」
以下のように一般的に文脈から予測する場合、それより前の文字列から予測する一方向的な学習しかできませんでした。
$$ p(x_n|x_1,x_2,…,x_{n-1}) $$
しかしこのBERTは、双方向から文脈を学習できるようになったのです。
BERTがSEOに与える影響

先ほどの検索結果の例でも挙げましたが、BERT導入によりGoogleは検索意図を明確に読み取れるように進化しました。
これは、Googleが「Rank Brain」を導入した2015年以来の大きな進化と言えるでしょう!
別の例を見てみましょう!
(引用元:Google-”Understanding searches better than ever before”)
こちらの例では、”Stand”という単語の意味が焦点になっています。
BERT実装前は、エステティシャンという職業の立ち位置的な受け取り方をGoogleはしており、結果的に医療エステティシャンとスパエステティシャンはどっちが良いか的な記事を返しています。
しかし、検索者が知りたいのはエステティシャンの物理的な立ちについて。立ち時間や労働環境について知りたいんです。
BERT後はしっかりエステティシャンの物理的な労働環境について返しています。
英語でもそうですが、日本語においても同じ単語が別の文脈では別の意味で使われることは多いです。
そのような状況でもBERTは文脈から適切に検索意図を読み取ることができるようになっているのです。
日本語BERTをPythonで実装してみる

それでは、そんなBERTを実際に実装してみましょう!
BERTを使って以下の日本語文章の空白を予測してみます。
※昔はスタビジは統計ラボというサイト名でした
[‘統計’, ‘ラボ’, ‘は’, ‘*’, ‘を’, ‘発信’, ‘する’, ‘サイト’, ‘です’]
また、実装にはGoogle colaboratoryを使います。
Google colaboratoryはGPUを使用できる強力なクラウドサービス!以下の記事で詳しくまとめているので参考にしてみてください!

また、今回のBERTをGoogle colaboratoryで実装する上で以下の2つの記事を参考にさせていただきました。非常に有用ですので合わせて読んでみてください。
さて、BERTを本格的に日本語に適応して実装するには、そこそこ事前準備が必要なので整理しておきましょう!
・形態素解析のためのJUMAN++インストール
・BERT日本語Pretrainedモデルのダウンロード
・各種必要なライブラリをインストール
JUMAN++とBERT日本語Pretrainedモデルは京都大学の黒橋・河原・村脇研究室からインストールしていきます!
自然言語処理に有用な様々なフレームワークを展開してくれています。
ありがたい!順に見ていきましょう!
形態素解析のためのJUMAN++インストール
京都大学の黒橋・河原・村脇研究室の作成した強力な形態素解析器JUMAN++をインストールしていきます。
こちらは、定番のMeCabよりも口語に対応している形態素解析です。
Google colaboratory上で以下のように記述しインストールを進めます。
1 2 3 4 5 6 7 8 9 10 11 | !wget https://github.com/ku-nlp/jumanpp/releases/download/v2.0.0-rc2/jumanpp-2.0.0-rc2.tar.xz && tar xJvf jumanpp-2.0.0-rc2.tar.xz && rm jumanpp-2.0.0-rc2.tar.xz && cd jumanpp-2.0.0-rc2/ && mkdir bld && cd bld && cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local && make && sudo make install |
※10分ほど時間がかかります。
BERT日本語Pretrainedモデルのダウンロード
まず、BERTを実装するためには日本語における相当な量の事前学習が必要なのですが京都大学の黒橋・河原・村脇研究室が公開してくれています。
非常にありがたいですね!
まずは、Google colaboratory上でGoogle driveをマウントしていきます。
1 2 3 4 | from google.colab import drive drive.mount('/content/drive') |
これによりGoogle drive上と同期をとるコトが可能です。
結果のURLからパスを入手してGoogle colaboratory上で記述しましょう!
続いて、Google drive上に日本語モデルを格納するフォルダを作成します。
1 | !mkdir -p /content/drive/'My Drive'/bert/japan_test |
作成したディレクトリに移動します。
1 | cd /content/drive/'My Drive'/bert/japan_test |
移動したら、早速黒橋・河原・村脇研究室で公開しているモデルをダウンロードしていきましょう!
1 2 3 4 | import urllib.request kyoto_u_bert_url = "http://nlp.ist.i.kyoto-u.ac.jp/nl-resource/JapaneseBertPretrainedModel/Japanese_L-12_H-768_A-12_E-30_BPE.zip" urllib.request.urlretrieve(kyoto_u_bert_url, "Japanese_L-12_H-768_A-12_E-30_BPE.zip") |
続いてZIPファイルを解凍していきます。
1 | !unzip Japanese_L-12_H-768_A-12_E-30_BPE.zip |
これで、日本語モデルの準備は完了です。
各種必要なライブラリをインストール
最後に必要なライブラリをpipインストールしていきます。
1 2 | !pip install transformers !pip install pyknp |
Python上のインポートを行います。
1 2 3 4 5 | import torch from transformers import BertTokenizer, BertForMaskedLM, BertConfig import numpy as np from pyknp import Juman jumanpp = Juman() |
pyknpは黒橋・河原・村脇研究室が提供する、JumanとKNPのバインディングフレームワークです。
transformersは色々と使用用途があるみたいですが、今回はBERTのモデルやパラメータ取得、インプットデータの加工などに使います。
これで準備が整いました。本実装していきます。
BERT本実装
1 2 3 4 5 | config = BertConfig.from_json_file('/content/drive/My Drive/bert/japan_test/Japanese_L-12_H-768_A-12_E-30_BPE/bert_config.json') model = BertForMaskedLM.from_pretrained('/content/drive/My Drive/bert/japan_test/Japanese_L-12_H-768_A-12_E-30_BPE/pytorch_model.bin', config=config) bert_tokenizer = BertTokenizer('/content/drive/My Drive/bert/japan_test/Japanese_L-12_H-768_A-12_E-30_BPE/vocab.txt', do_lower_case=False, do_basic_tokenize=False) |
必要なパラメータやモデル、BERTが扱いやすい形に加工するための変換処理などを先ほどダウンロードした日本語Pretrainedモデルから取得します。
1 2 3 4 | text = "スタビジは*を発信するサイトです" result = jumanpp.analysis(text) tokenized_text = [mrph.midasi for mrph in result.mrph_list()] print(tokenized_text) |
続いて、JUMAN++によって品詞分解を行います。
[‘統計’, ‘ラボ’, ‘は’, ‘*’, ‘を’, ‘発信’, ‘する’, ‘サイト’, ‘です’]
1 2 3 4 5 | tokenized_text.insert(0, '[CLS]') tokenized_text.append('[SEP]') masked_index = 4 tokenized_text[masked_index] = '[MASK]' print(tokenized_text) |
文章の区切れやマスクする部分をBERTに明示的に知らせるために、SEPやMASKを挿入していきます。
CLSは文章の頭に、SEPは文章の区切れに、MASKは隠したい部分に適用します。
[‘[CLS]’, ‘統計’, ‘ラボ’, ‘は’, ‘[MASK]’, ‘を’, ‘発信’, ‘する’, ‘サイト’, ‘です’, ‘[SEP]’]
1 2 | tokens = bert_tokenizer.convert_tokens_to_ids(tokenized_text) tokens_tensor = torch.tensor([tokens]) |
そして、得られたテキストをBERT用に変換します。
1 2 3 4 5 6 7 | model.eval() with torch.no_grad(): outputs = model(tokens_tensor) predictions = outputs[0] _,predicted_indexes = torch.topk(predictions[0, masked_index], k=10) predicted_tokens = bert_tokenizer.convert_ids_to_tokens(predicted_indexes.tolist()) print(predicted_tokens) |
そして、マスクされた部分の予測を行います。
結果は・・・
[‘統計’, ‘情報’, ‘データ’, ‘ニュース’, ‘それ’, ‘調査’, ‘分析’, ‘レポート’, ‘トレンド’, ‘ランキング’]
上手く予測できていることが分かります!

マスク部分を前に持ってきても上手く予測できました!
[‘*’, ‘を’, ‘発信’, ‘する’, ‘サイト’, ‘が’, ‘統計’, ‘ラボ’, ‘です’]
[‘統計’, ‘データ’, ‘情報’, ‘それ’, ‘これ’, ‘結果’, ‘ニュース’, ‘調査’, ‘ランキング’, ‘トレンド’]
BERT まとめ
BERTについてSEO観点と機械学習観点から見てきました!
それぞれの観点からBERTについて簡単にまとめてみましょう!
今後GoogleはBERTにとどまらず、さらなる精度のアップデートを行うでしょう!
日々めまぐるしい進化が起こる業界ではありますが、自分のペースで徐々にキャッチアップしていきましょう!
ちなみに自然言語処理については以下の記事でまとめているので合わせてチェックしてみてください!
