退会済みユーザー
2022/11/21 08:57 編集
.
投稿2022/11/20 10:12
編集2022/11/22 15:18東北大版BERTを用いて、日本語文をベクトルに変換します。
そのときに、文中にある特定の単語のベクトルのみを文中から抜き出したいです。
(文中の特定の単語ベクトルを2箇所から抜き出し、それらの2単語のcos類似度を求めたいからです。)
足りない点はコメントしていただけると幸いです。
東北大版BERTを用いて、text.txtの”波紋が広がり終わったあとの池の水面のような表情だ。”をBERTを用いてベクトルに変換します。
このときtext.txtを形態素解析(MeCab)をすると、
'波', '##紋', 'が', '広がり', '終わっ', 'た', 'あと', 'の', '池', 'の', '水面', 'の', 'よう', 'な', '表情', 'だ', '。'
のように分割されています。
このときの’表情’のベクトルのみを抜き出す方法を知りたいです。
今のプログラムだと結果は出てきますが、aとbで新たにベクトルを作り出しており、、text.txtの文中から抜き出せていません。文中から抜き出した単語ベクトルを使えるようにしたいです。
text.txt
1波紋が広がり終わったあとの池の水面のような表情だ。
python
1# tohoku-BERT 2from transformers import BertConfig, BertModel 3from transformers import BertJapaneseTokenizer 4from transformers.models.bert_japanese import tokenization_bert_japanese 5 6config = BertConfig.from_json_file('config.json') 7config.output_hidden_states = True # 各層の情報の取り出し 8model = BertModel.from_pretrained('pytorch_model.bin', config=config) 9tknz = BertJapaneseTokenizer(vocab_file='vocab.txt', do_lower_case=False, do_basic_token 10ize=False) 11tknz.word_tokenizer = tokenization_bert_japanese.MecabTokenizer() 12 13# ここまでBERTモデルの読み込みです 14 15import torch 16import numpy as np 17from numpy.linalg import norm 18import sys 19 20# text.txtの文をベクトルに変換する 21def sentence2vec(sentence): 22 sentence = tknz.encode(sentence) 23 sentence = torch.LongTensor(sentence).unsqueeze(0) 24 vec = model(sentence) 25 vec = (vec[2][11]).to('cpu').detach().numpy().copy() 26 # 11層の出力結果をTensor型からnumpy型に変更 27 return vec 28 29 30# cos類似度を算出する 31def cos_similarity(a, b, eps=1e-8): 32 cos = np.dot(a, b) / ( norm(a) * norm(b) +eps ) 33 return cos 34 35 36#text.txtを開く 37with open(sys.argv[1], "r", encoding="utf-8") as f: 38 for sentence in f: 39 vec = sentence2vec(sentence) 40 a = "池の水面" 41 b = "表情" 42 A_vec = model(torch.LongTensor( tknz.encode(a) ).unsqueeze(0)) 43 B_vec = model(torch.LongTensor( tknz.encode(b) ).unsqueeze(0)) 44 45 A_vec = A_vec[2][11]).to('cpu').detach().numpy().copy() 46 B_vec = B_vec[2][11]).to('cpu').detach().numpy().copy() 47 cos = cos_similarity(A_vec, B_vec) 48 print(cos)
python3.10.4
回答1件
あなたの回答
tips
プレビュー