# 使用するパッケージのimport
import os
import numpy as np
from scipy.stats import mode
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
from sklearn.naive_bayes import MultinomialNB
from sklearn.neighbors import KNeighborsClassifier
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
import spacy
from spacy import displacy
nlp = spacy.load("en_core_web_sm")
# 対象とするテキストファイルの読み込み
fnames = os.listdir("../DATA02/NICE_NNS2/")
## ファイル名をソート ##
fnames.sort()
T = []
for i in fnames:
f = open("../DATA02/NICE_NNS2/"+i,"r")
text = f.read()
f.close()
T.append(text)
def feature_count(X):
s = len(sent_tokenize(X))
tokens = word_tokenize(X)
w = len(tokens)
types = len(list(set(tokens)))
ttr = types / w
wps = w / s
F = [s,w,ttr,wps]
return F
Features_1 = []
for i in T:
j = feature_count(i)
Features_1.append(j)
Features_1[0]
[25, 392, 0.44387755102040816, 15.68]
CLAUSE = ["advcl","relcl","ccomp","csubj"]
CpS = []
for i in T:
c = 0
sents = sent_tokenize(i)
s = len(sents)
for j in sents:
doc = nlp(j)
for token in doc:
if token.dep_ in CLAUSE:
c +=1
CpS.append(c/s)
NL = []
for i in T:
tmp = []
sents = sent_tokenize(i)
for j in sents:
doc = nlp(j)
for chunk in doc.noun_chunks:
tmp.append(len(chunk.text.split()))
NL.append(sum(tmp)/len(tmp))
X = []
for i,j,k in zip(Features_1,CpS,NL):
x = i + [j] + [k]
X.append(x)
X[0]
[25, 392, 0.44387755102040816, 15.68, 0.28, 1.8144329896907216]
# スコアの読み込み
Eva = pd.read_csv("../DATA02/nice_evaluation.csv",index_col=0)
Y = list(Eva["score"])
# 上でリストに保存した特徴量をデータフレームに保存
data = pd.DataFrame(X,columns=["sents","words","TTR","WPS","CPS","NPL"])
data.head()
| sents | words | TTR | WPS | CPS | NPL | |
|---|---|---|---|---|---|---|
| 0 | 25 | 392 | 0.443878 | 15.680000 | 0.280000 | 1.814433 |
| 1 | 18 | 288 | 0.350694 | 16.000000 | 0.611111 | 1.931507 |
| 2 | 26 | 548 | 0.452555 | 21.076923 | 0.884615 | 1.784722 |
| 3 | 21 | 332 | 0.400602 | 15.809524 | 0.809524 | 1.365385 |
| 4 | 18 | 391 | 0.493606 | 21.722222 | 1.166667 | 1.690000 |
# それぞれの特徴量の変動係数を計算
CV = []
for i in data.columns:
cv = data[i].std()/data[i].mean()
CV.append(cv)
# 算出した変動係数をデータフレームに保存
data_cv = pd.DataFrame([CV],columns=data.columns,index=["CV"])
data_cv
| sents | words | TTR | WPS | CPS | NPL | |
|---|---|---|---|---|---|---|
| CV | 0.373414 | 0.37209 | 0.14136 | 0.258507 | 0.434414 | 0.101353 |
CC = []
for i in data.columns:
cc = np.corrcoef(Y,data[i].values)[0][1]
CC.append(cc)
data_cc = pd.DataFrame([CC],columns=data.columns,index=["CC"])
data_cc
| sents | words | TTR | WPS | CPS | NPL | |
|---|---|---|---|---|---|---|
| CC | 0.282074 | 0.697879 | -0.301265 | 0.570192 | 0.36007 | 0.289299 |
data.corr()
| sents | words | TTR | WPS | CPS | NPL | |
|---|---|---|---|---|---|---|
| sents | 1.000000 | 0.714656 | -0.566967 | -0.290585 | -0.278658 | -0.086715 |
| words | 0.714656 | 1.000000 | -0.581803 | 0.417961 | 0.245815 | 0.237285 |
| TTR | -0.566967 | -0.581803 | 1.000000 | -0.083262 | -0.185807 | -0.001388 |
| WPS | -0.290585 | 0.417961 | -0.083262 | 1.000000 | 0.714217 | 0.445935 |
| CPS | -0.278658 | 0.245815 | -0.185807 | 0.714217 | 1.000000 | 0.017773 |
| NPL | -0.086715 | 0.237285 | -0.001388 | 0.445935 | 0.017773 | 1.000000 |
data_corr = data
data_corr["score"] = Y
data_corr.head()
| sents | words | TTR | WPS | CPS | NPL | score | |
|---|---|---|---|---|---|---|---|
| 0 | 25 | 392 | 0.443878 | 15.680000 | 0.280000 | 1.814433 | 3 |
| 1 | 18 | 288 | 0.350694 | 16.000000 | 0.611111 | 1.931507 | 3 |
| 2 | 26 | 548 | 0.452555 | 21.076923 | 0.884615 | 1.784722 | 5 |
| 3 | 21 | 332 | 0.400602 | 15.809524 | 0.809524 | 1.365385 | 3 |
| 4 | 18 | 391 | 0.493606 | 21.722222 | 1.166667 | 1.690000 | 3 |
sns.pairplot(data_corr,hue="score",plot_kws=dict(alpha=0.4),palette="viridis")
<seaborn.axisgrid.PairGrid at 0x7e04d0312e10>