練習問題1¶
ここまで扱ってきたデータの英語学習者に関して部分的に評価値が付与されています。評価値は"../DATA02/nice_evaluation.csv"に保存されています。評価された作文は"../DATA02/NICE_NNS2"に保存されています。ここで学んだ同様の手順でこのデータを自動採点するシステムを構築し、交差検証を行いなさい。
In [7]:
# 使用するパッケージのimport
import os
import numpy as np
import pandas as pd
from nltk import word_tokenize,sent_tokenize
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix
from sklearn.naive_bayes import GaussianNB
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
In [8]:
# 対象とするテキストファイルの読み込み
fnames = os.listdir("../DATA02/NICE_NNS2/")
## ファイル名をソート ##
fnames.sort()
X_text = []
for i in fnames:
f = open("../DATA02/NICE_NNS/"+i,"r")
text = f.read()
f.close()
X_text.append(text)
In [9]:
# スコアの読み込み
E = pd.read_csv("../DATA02/nice_evaluation.csv",index_col=0)
Y = list(E["score"])
In [10]:
# データの分割
X_text_train,X_text_test,y_train,y_test = train_test_split(X_text,Y,test_size=0.2)
In [11]:
# 作文のベクトル化
vectorizer = CountVectorizer(min_df=1,ngram_range=(2,2))
vectorizer.fit(X_text_train)
X_train = vectorizer.transform(X_text_train).toarray()
X_test = vectorizer.transform(X_text_test).toarray()
In [12]:
# ナイーブベイズ分類器のクラス
from sklearn.naive_bayes import MultinomialNB
# インスタンスの生成
nbc = MultinomialNB()
# トレーニングデータでモデル構築
nbc.fit(X_train,y_train)
# テストデータの評価を予測して、予測精度の出力
nbc.score(X_test,y_test)
Out[12]:
0.4
In [13]:
X_text_train,X_text_test,y_train,y_test = train_test_split(X_text,Y,test_size=0.2)
vectorizer.fit(X_text_train)
X_train = vectorizer.transform(X_text_train).toarray()
X_test = vectorizer.transform(X_text_test).toarray()
nbc = MultinomialNB()
nbc.fit(X_train,y_train)
Y_pred = nbc.predict(X_test)
In [14]:
cm = confusion_matrix(y_test,Y_pred)
cm
Out[14]:
array([[ 0, 5, 2, 0], [ 0, 12, 2, 0], [ 0, 2, 1, 0], [ 0, 1, 0, 0]])
In [15]:
sns.heatmap(cm,annot=True,cmap="Blues")
Out[15]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f8569d7f240>
練習問題2¶
前回の練習問題同様、文数、語数、type token ratio、words per sentenceを予測変数として、ナイーブベイズ分類器を用いて評価値を予測する自動採点システムを構築し、交差検証を行いなさい。
In [16]:
from nltk import word_tokenize,sent_tokenize
def counters(X):
s = len(sent_tokenize(X))
tokens = word_tokenize(X)
w = len(tokens)
types = len(list(set(tokens)))
ttr = types / w
wps = w / s
Y = [s,w,ttr,wps]
return Y
In [17]:
X = []
for i in X_text:
X.append(counters(i))
In [18]:
# 交差検証
S = []
nbc = GaussianNB()
for i in range(100):
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3)
nbc.fit(X_train,Y_train)
S.append(nbc.score(X_test,Y_test))
np.average(S)
Out[18]:
0.5143243243243244
In [19]:
nbc = MultinomialNB()
nbc.fit(X_train,Y_train)
Y_pred = nbc.predict(X_test)
cm = confusion_matrix(Y_test,Y_pred)
cm
Out[19]:
array([[ 4, 7, 0, 0], [ 0, 11, 1, 0], [ 1, 9, 1, 0], [ 0, 1, 1, 1]])
In [20]:
sns.heatmap(cm,annot=True,cmap="Blues")
Out[20]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f8569efda58>