Contenu connexe
Similaire à Elasticsearch勉強会#44 20210624 (20)
Plus de Tetsuya Sodo (10)
Elasticsearch勉強会#44 20210624
- 2. Who am I ?
2
名前: 惣道 哲也 (そうどう てつや)
Twitter: @tetsuyasd
所属: 日本マイクロソフト株式会社 クラウドアーキテクト事業本部
職務: Microsoft Azure導入支援にまつわるいろいろ(調査、検証、提案)
技術: Cloud / Container / Data Analytics / etc…
#elasticsearchjp
- 3. 本日のセッションの背景・概要・動機
■背景: Elasticsearch 7.3で高次元ベクトル向けフィールドタイプがGAになった
– これまでのインデックスを用いたドキュメント検索とは異なる仕組み
– Elasticsearchの高速な検索機能に加えて、高精度な自然言語処理タスクを組み合わせることも可能に
■概要: テキスト埋め込み技術として注目を集めたBERTを題材として、Elasticsearchのベクトル
フィールドと組み合わせた日本語テキスト類似検索に関する情報整理と動作検証を行う
– BERTの簡単な概要
– Elasticsearchのベクトルフィールドの概要とそれを利用した検索の仕組み
– デモ(先人のデモをなぞる程度です)
■動機: BERTについて聞いたことあったがきちんと調べたことがなかったのでこの機会に・・・
–デモで動かすことでより深く理解できるかもという期待
–自然言語処理系の検索技術のキャッチアップと今後の技術展望の理解
3
#elasticsearchjp
- 7. コサイン類似度 → 何となくわかる
■2つのベクトルの「類似度(≒近さ)」を表現する1手法
– ベクトルα、βが角度θを持つとき
– 全く同一方向の場合 cosθ=cos0°=1
– 垂直方向の場合 cosθ=cos90°=0
– 逆方向の場合 cosθ=cos180°=-1
7
#elasticsearchjp
a
α(x1,y1,z1)
β(x2,y2,z2)
θ
cosθ =
|α|・|β|
α・β
→
→
→ →
→ →
コサイン類似度の計算方法
※ベクトル長は1に正規化されるケースが多い
その場合、cosθは2ベクトルの内積として求められる
つまり -1~1 の間の値を持ち、
「類似度」が高いほど1に近い値になる
- 13. BERTのベクトル化のイメージ
– 入力例①
– “東京ディズニーシーの人気アトラクション「センター・オブ・ジ・アース」の世界を映画化した第2弾
『センター・オブ・ジ・アース・・・”
– 出力例①
– [-0.9192637205123901, -0.07473928481340408, 0.08322068303823471, …
-0.43304893374443054, 0.6378014087677002, 0.04336249455809593]
– 入力例②
– “”『24 -TWENTYFOUR-』が終了してから2年、ジャック・バウワー役のキーファー・サザーランドが
主演を務める最新海外ドラマ『TOUCH/タッチ』が10・・・”
– 出力例②
– [-0.8536872863769531, -0.048283740878105164, -0.008795815519988537,…
-0.3717033565044403, -0.522616982460022, -0.10493569076061249]
13
#elasticsearchjp
このベクトル同士のコサイン
類似度が大きければ
似た文章と考えられる
ここでのBERTの入力は自然言語テキスト、出力は固定長多次元ベクトル(100~数100次元が一般的)となる。
このとき「モデルの精度が高い」と、入力した文章に対してより適切なベクトルを出力できて、さまざまな応用タ
スクで高精度な識別が可能になる。
- 16. 今回やりたいこと
■BERTクライアントからBERTサーバにベクトル変換をさせるコード例(下図赤枠内②③の動作)
16
#elasticsearchjp
$ python3
Python 3.8.5 (default, May 27 2021, 13:30:53) [GCC 9.3.0] on linux
>>> from bert_serving.client import BertClient
>>> bc = BertClient(ip='bart01', output_fmt='list’)
>>> vector = bc.encode(["テストの文章です"])
>>> vector
[[-0.6728561520576477, -0.20123611390590668, 0.13580602407455444, 0.5271162986755371,
0.04913650453090668, -0.14195780456066132, 0.0345018170773983, 0.1410500407218933,
…
, 0.3903881907463074, -0.21575897932052612]]
>>> len(vector)
1
>>> len(vector[0])
768
>>>
- 18. 検証手順(概要)
■Elasicsearch/Kibanaの起動
– ES/Kibanaを起動しておく
■BERTサーバの起動
– BERTのモデルファイルをダウンロードしておく
– BERTサーバのコンテナイメージを起動する(引数にモデルファイルを指定)
■事前ドキュメント格納
– Livedoorニュースコーパス(Rondhuitさん公開 *1)をダウンロードする
– スクリプトを使ってCSVフォーマットに変換する
– Elasticsearchにindexを作っておく(vectorフィールドを持つmappingを定義する)
– スクリプトを使ってBERT変換およびESへのbulkインサートをする
■Flask(Webアプリ)コンテナのbuildおよび起動
– Webアプリコンテナをbuildする
– Webアプリコンテナを起動
18
#elasticsearchjp
(*1) https://www.rondhuit.com/download.html
各記事ファイルにはクリエイティブ・コモンズライセンス「表示-改変禁止」が適用されます。詳細は上記URLの記載を参照ください。
livedoor はNHN Japan株式会社の登録商標です。livedoorニュースコーパスは、NHN Japan株式会社が運営する「livedoor ニュース」
のうち、クリエイティブ・コモンズライセンスが適用されるニュース記事を収集し、可能な限りHTMLタグを取り除いて作成したものです。
- 25. 参考URL
25
– ベクトルフィールドを使ったテキスト類似性検索
https://www.elastic.co/jp/blog/text-similarity-search-with-vectors-in-elasticsearch
– Dense Vector field type(7.13)
https://www.elastic.co/guide/en/elasticsearch/reference/current/dense-vector.html
– ElasticsearchとBERTを組み合わせて類似文書検索
https://hironsan.hatenablog.com/entry/elasticsearch-meets-bert
– Elasticsearchで分散表現を使った類似文書検索
https://yag-ays.github.io/project/elasticsearch-similarity-search/
– livedoorニュースコーパスをcsvファイル形式で取得する
https://nxdataka.netlify.app/ldncsv/
– 汎用言語表現モデルBERTを日本語で動かす(PyTorch)
https://qiita.com/Kosuke-Szk/items/4b74b5cce84f423b7125
– NICT BERT日本語Pre-trainedモデル
https://alaginrc.nict.go.jp/nict-bert/index.html
– BERT以降の事前学習済みモデルのトレンドと主要モデルを紹介!Part1学習方法編
https://elyza-inc.hatenablog.com/entry/2021/03/25/160727
– [速報]マイクロソフト、自然言語をプログラミング言語にAIで変換、新ノーコード機能をPower Appsに搭載。
AI言語モデル「GPT-3」を採用。Microsoft Build 2021
https://www.publickey1.jp/blog/21/aipower_appsaigpt-3microsoft_build_2021.html
- 31. 検証手順
■事前ドキュメント格納: CSVファイルを元にBERTサーバにテキストを投げて変換し、JSONに整形①
31
#elasticsearchjp
$ cd bertsearch
$ vi example/create_documents.py
…
doc = {
‘title’: series.Title, ## Title -> title に修正する
‘text’: series.Description ## Description -> body に修正する
}
…
# with open(args.save, ‘w’) as f: ## 赤字部分をコメントアウトし、次の2行に入れ替える
import codecs
with codecs.open(args.save, 'w', 'utf-8') as f:
…
# f.write(json.dumps(d) + ‘¥n’) ## 赤字部分をコメントアウトし、次の2行に入れ替える
json.dump(d, f, ensure_ascii=False)
f.write('¥n’)
…
- 32. 検証手順
■事前ドキュメント格納: CSVファイルを元にBERTサーバにテキストを投げて変換し、JSONに整形②
32
#elasticsearchjp
$ cd bertsearch
$ python3 example/create_documents.py --data=../livedoornews.csv ¥
--index_name=testindex
(この処理は時間がかかります)
$ wc -l documents.jsonl
7367
$ cat documents.jsonl
{"_op_type": "index", "_index": "testindex", "text": "東京ディズニーシーの人気アトラクション
「センター・オブ・ジ・アース」の世界を映画化した第2弾『センター・オブ・ジ・アー… ", "title": "独占入手!
「センター・オブ・ジ・アース」のゲームを先行プレイ", "text_vector": [-0.9192637205123901, -
0.07473928481340408, 0.08322068303823471, -0.10188467800617218, -0.43304893374443054,
…, 0.6378014087677002, 0.04336249455809593]}
{"_op_type": "index", "_index": "testindex", "text": "『24 -TWENTYFOUR-』が終了してから2年、
ジャック・バウワー役のキーファー・サザーランドが主演を務める最新海外ドラマ『TOUCH/タッチ』が10…