第5回の練習問題の解答例¶
- 日本人英語学習者が以下の問題に回答しました。
When you want to break into a conversation and add something, what would you say?
- 評定者によって1 (Good)と採点されたデータは、../DATA02/TALL06_1.txtに、0 (Poor)と採点されたデータは../DATA02/TALL06_0.txtに保存されています。
- 以下の発話はGoodとPoorのどちらと判定されるべきでしょうか。
- ユークリッド距離あるいはコサイン類似度を算出してみましょう。
- can i join your conversation
- join me a conversation
- let me talk
- please listen to me
In [2]:
# Goodという評価が付与された発話のファイルを読み込む
f = open("../DATA02/TALL06_1.txt","r")
text = f.read()
f.close()
# ひとつの発話が1行で示されているので改行で分割してリストにする
good_text = text.split("\n")
# Poorという評価が付与された発話のファイルを読み込む
f = open("../DATA02/TALL06_0.txt","r")
text = f.read()
f.close()
# ひとつの発話が1行で示されているので改行で分割してリストにする
poor_text = text.split("\n")
# CountVectorizerでベクトル化する際にすべての単語を利用するので
# GoodとPoorを結合したリストの作成
all_text = good_text + poor_text
# CountVectorizerのimport
from sklearn.feature_extraction.text import CountVectorizer
# インスタンスの生成
vectorizer = CountVectorizer(min_df=1)
# インスタンスに単語を登録
vectorizer.fit(all_text)
# Good、Poorを個別にベクトル化
good_vec = vectorizer.transform(good_text).toarray()
poor_vec = vectorizer.transform(poor_text).toarray()
# 判定するテキストをリストに代入
new_text =["can i join your conversation","join me a conversation","let me talk","please listen to me"]
# 判定するテキストのベクトル化
new_vec = vectorizer.transform(new_text).toarray()
# numpyのimport
import numpy as np
# 出力のためのn
# 以下のfor文でカウントアップする
n = 0
# new_vecからひとつの発話ベクトルを取り出し、good_vec、
# poor_vecそれぞれですべての発話とnew_vecの発話の
# ユークリッド距離を算出し、それぞれで平均値を算出する
# 最後のif...else...はGoodとPoorでの距離の平均値を比較して
# Goodへの平均的な距離が近ければ"Good!"、そうでなければ
# "Poor!"と出力
for v in new_vec:
n += 1
G = []
for g in good_vec:
euc = np.linalg.norm(v - g)
G.append(euc)
good_average = np.average(G)
P = []
for p in poor_vec:
euc = np.linalg.norm(v - p)
P.append(euc)
poor_average = np.average(P)
if good_average < poor_average:
print(n, ":" + "Good!")
else:
print(n, ":" + "Poor!")
1 :Good! 2 :Good! 3 :Poor! 4 :Poor!
In [ ]: