質問編集履歴

1

質問の意図をわかりやすく書いた

2022/11/22 03:34

投稿

tako15
tako15

スコア11

test CHANGED
@@ -1 +1 @@
1
- 【意見募集】リスト中にある特定のキーワードインデッ知りたい
1
+ 中にある特定の単語トルのみ文中から抜き出したい
test CHANGED
@@ -1,25 +1,26 @@
1
1
  ### 前提
2
2
 
3
- 東北大版BERTを用いて、文中の「AのようなB」という、直喩のAとBの類似度算出するプログラムを組んでいます。
3
+ 東北大版BERTを用いて、日本語文をベクトルに変換します。
4
- text.txtにある”波紋が広がり終わったあと水面ような表情だ。”の例の場合、Aが”池の水面”、Bが”表情”となります。
4
+ ときに、にある特定単語ベクトルみを中から抜き出したいです。
5
- 全体MeCabで分ち書するので、Aは”池 の 水面”、Bが”表情”となります。
5
+ 中の特定の単語ベクトル2箇所ら抜出し、それら2単語のcos類似度を求めたいからです。
6
- cos類似度は例文で考えると、”池”と”表情”、”の”と”表情”、”水面”と”表情”の3つのcos類似度の平均をとり、それを”池の水面”と”表情”のcos類似度にします。
7
6
 
7
+ 足りない点はコメントしていただけると幸いです。
8
8
  ### 実現したいこと
9
9
 
10
- 文中でAとBに該当するインデックス(a = vec[0][5] のように)の指定方法の案を頂きたいです。
11
- 該当のpythonコード内にある、vecリスト中身がが文字列でれば指定は簡単のですが、実際は行列であるため、指定方法難航ております。
10
+ 東北大版BERTを用いて、text.txt”波紋り終わったとの池の水面のよう表情だ。”をBERTを用いてベクトル変換します。
11
+
12
+ このときtext.txtを形態素解析(MeCab)をすると、
13
+ '波', '##紋', 'が', '広がり', '終わっ', 'た', 'あと', 'の', '池', 'の', '水面', 'の', 'よう', 'な', '表情', 'だ', '。'
14
+ のように分割されています。
15
+
12
- まだ試せていないで、これで来そうなどの意見で構わないです。
16
+ ときの’表情’のベクトルのみを抜きす方法を知りたいです。
13
- 丸投げな質問で申し訳ありません。進捗が進み次第、適宜追加で情報を更新していきます。
14
17
 
15
18
  ### 発生している問題・エラーメッセージ
16
- 今のところありません
19
+ 今のプログラムだ結果は出てきますが、aとbで新たにベクトルを作出しており、、text.txtの文中から抜き出せていません。文中から抜き出した単語ベクトルを使えるようにしたいです。
17
20
 
18
21
  ### 該当のソースコード
19
22
  ```text.txt
20
23
  波紋が広がり終わったあとの池の水面のような表情だ。
21
- そしてお互いの瞳の中に、遠く離れた恒星のような輝きを認めあった。
22
- 空は敷物のようなのっぺりとした灰色の雲に覆われていた。
23
24
  ```
24
25
  ```python
25
26
  # tohoku-BERT
@@ -41,7 +42,7 @@
41
42
  from numpy.linalg import norm
42
43
  import sys
43
44
 
44
- # sentence -> vec
45
+ # text.txtの文をベクトルに変換する
45
46
  def sentence2vec(sentence):
46
47
  sentence = tknz.encode(sentence)
47
48
  sentence = torch.LongTensor(sentence).unsqueeze(0)
@@ -51,23 +52,24 @@
51
52
  return vec
52
53
 
53
54
 
54
- # cos類似度
55
+ # cos類似度を算出する
55
56
  def cos_similarity(a, b, eps=1e-8):
56
57
  cos = np.dot(a, b) / ( norm(a) * norm(b) +eps )
57
58
  return cos
58
59
 
59
60
 
60
- cos_list = [] # 一応結果まとめておリスト
61
+ #text.txt
61
-
62
- with open(sys.argv[1], "r", encoding="utf-8") as f: #text.txtを開く
62
+ with open(sys.argv[1], "r", encoding="utf-8") as f:
63
63
  for sentence in f:
64
64
  vec = sentence2vec(sentence)
65
- # 以下のコードがわからない部分です
66
- a = vec[0][5] # 5番目
65
+ a = "池の水面"
67
- b = vec[0][8] # 8番目
66
+ b = "表情"
67
+ A_vec = model(torch.LongTensor( tknz.encode(a) ).unsqueeze(0))
68
+ B_vec = model(torch.LongTensor( tknz.encode(b) ).unsqueeze(0))
69
+
70
+ A_vec = A_vec[2][11]).to('cpu').detach().numpy().copy()
71
+ B_vec = B_vec[2][11]).to('cpu').detach().numpy().copy()
68
- cos = cos_similarity(a,b)
72
+ cos = cos_similarity(A_vec, B_vec)
69
- cos_list.append(cos)
70
-
71
73
  print(cos)
72
74
  ```
73
75