質問編集履歴
1
質問の意図をわかりやすく書いた
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
文中にある特定の単語のベクトルのみを文中から抜き出したい
|
test
CHANGED
@@ -1,25 +1,26 @@
|
|
1
1
|
### 前提
|
2
2
|
|
3
|
-
東北大版BERTを用いて、文
|
3
|
+
東北大版BERTを用いて、日本語文をベクトルに変換します。
|
4
|
-
|
4
|
+
そのときに、文中にある特定の単語のベクトルのみを文中から抜き出したいです。
|
5
|
-
文
|
5
|
+
(文中の特定の単語ベクトルを2箇所から抜き出し、それらの2単語のcos類似度を求めたいからです。)
|
6
|
-
cos類似度は例文で考えると、”池”と”表情”、”の”と”表情”、”水面”と”表情”の3つのcos類似度の平均をとり、それを”池の水面”と”表情”のcos類似度にします。
|
7
6
|
|
7
|
+
足りない点はコメントしていただけると幸いです。
|
8
8
|
### 実現したいこと
|
9
9
|
|
10
|
-
文中でAとBに該当するインデックス(a = vec[0][5] のように)の指定方法の案を頂きたいです。
|
11
|
-
|
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
|
-
#
|
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
|
-
|
61
|
+
#text.txtを開く
|
61
|
-
|
62
|
-
with open(sys.argv[1], "r", encoding="utf-8") as f:
|
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 =
|
65
|
+
a = "池の水面"
|
67
|
-
b =
|
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(
|
72
|
+
cos = cos_similarity(A_vec, B_vec)
|
69
|
-
cos_list.append(cos)
|
70
|
-
|
71
73
|
print(cos)
|
72
74
|
```
|
73
75
|
|