第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のどちらと判定されるべきでしょうか。
  • ユークリッド距離あるいはコサイン類似度を算出してみましょう。
  1. can i join your conversation
  2. join me a conversation
  3. let me talk
  4. 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 [ ]: