nlp的一个小测试:英文作文自动评分

最近这几天研究了一下英文作文自动评分系统,记录一下。

首先我很简单的利用各个文章的词频数和线性回归进行测试一下。采用内置的停用词。最大词频数量为10000.

# 统计文章中每篇文章的词频
def get_count_vectors(essays):
    vectorizer = CountVectorizer(max_features=10000, ngram_range=(1, 3), stop_words='english')

    count_vectors = vectorizer.fit_transform(essays)

    feature_names = vectorizer.get_feature_names()

    return feature_names, count_vectors

feature_names_cv, count_vectors = get_count_vectors(data[data['essay_set'] == 1]['essay'])

构建训练集和特征集。利用线性回归和岭回归进行训练,两者差距不大。

X_cv = count_vectors.toarray()
y_cv = data[data['essay_set'] == 1]['domain1_score'].values
print(X_cv.shape)
print(y_cv.shape)
X_train, X_test, y_train, y_test = train_test_split(X_cv, y_cv, test_size = 0.3)

linear_regressor = LinearRegression()
linear_regressor.fit(X_train, y_train)
y_pred = linear_regressor.predict(X_test)

# The coefficients
print('LinearRegression Coefficients: \n', linear_regressor.coef_)
# The mean squared error
print("LinearRegression Mean squared error: %.2f" % mean_squared_error(y_test, y_pred))
# Cohen’s kappa score: 1 is complete agreement
print('LinearRegression Cohen\'s kappa score: %.2f' % cohen_kappa_score(np.rint(y_pred), y_test))
print('LinearRegression MAPE:%.2f' % np.average(np.abs((y_test-y_pred)/y_test)))
print('-' * 50)

ridge = Ridge(alpha=1.0)
ridge.fit(X_train, y_train)
y_pred = ridge.predict(X_test)
print('Ridge Coefficients: \n', ridge.coef_)
print("Ridge Mean squared error: %.2f" % mean_squared_error(y_test, y_pred))
print('Ridge MAPE:%.2f' % np.average(np.abs((y_test-y_pred)/y_test)))

结果如下:

LinearRegression Coefficients: 
 [ 0.05621596  0.12232819 -0.01756035 ... -0.03792016  0.03945179
  0.01204416]
LinearRegression Mean squared error: 1.98
LinearRegression Cohen's kappa score: 0.14
LinearRegression MAPE:0.13
--------------------------------------------------
Ridge Coefficients: 
 [ 0.02735454  0.12872777 -0.03789763 ... -0.04311503  0.03712828
  0.01198802]
Ridge Mean squared error: 1.76
Ridge MAPE:0.13

现在进一步分析,首先提取一些特征并可视化数据:

主要做了以下特征:

# 每个单词平均有几个字母
# 文章单词总数
# 文章句子总数
# 文章字母总数
# 统计词形还原后的单词总数
# 文章中错误单词总数
# 统计名词,动词,形容词和副词的数量

代码过长,在这里就不展示了,文章末尾会贴出github链接。

#通过绘制以下散点图,我们可以检查上述不同特征如何影响学生获得的成绩。

#论文的字符数与论文的最终分数之间有很强的相关性。 论文的字数,句子数和引理数具有相似的相关性。 这些功能可能代表语言的流利性和灵活性。
#各种词性,例如名词,形容词,副词和动词,都是测试词汇的良好代表。 此功能也可以作为字典的基本代理。 名词与最终论文分数之间有很强的相关性。 文章的动词计数,形容词计数和副词计数也观察到类似趋势。
#我没有发现文章平均单词长度与其分数之间存在显着相关性。
#拼写错误的数量与论文的最终分数之间的相关性较弱。

基于上述分析,我们先把所有的新的特征进行训练。

线性回归结果为:

Coefficients: 
 [ 0.0009271   0.00248273 -0.00635289 ... -0.10944216  0.00864036
 -0.01215051]
Mean squared error: 1.29
LinearRegression MAPE:0.11
--------------------------------------------------
Ridge Coefficients: 
 [ 0.00111966  0.00157927 -0.00620896 ... -0.10232562  0.00640996
 -0.01115879]
Ridge Mean squared error: 1.24
Ridge MAPE:0.11
--------------------------------------------------

前后对比可以看出,mse值下降了很多。另外,线性回归跟岭回归结果差距不大,岭回归表现稍微好一点。

现在搜索参数试一下效果。

ridge_ = Ridge()
param_alpha = {'alpha': [0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 5.0, 10.0]}
grid = GridSearchCV(estimator=ridge_, param_grid=param_alpha)
grid.fit(X_train, y_train)


Grid Ridge Mean squared error: 1.06
Grid Ridge MAPE:0.10
------------------------------------------------

利用GBDT和随机森林和XGboost进行计算(它们之间的关系参考这篇文章简述决策树,随机森林和XGBOOST之间的关系_shange19的博客-CSDN博客):

Grid GBDT Mean squared error: 0.62
Grid GBDT MAPE:0.07
--------------------------------------------------
Grid RF Mean squared error: 1.21
Grid RF MAPE:0.11
--------------------------------------------------
Grid xgboost Mean squared error: 0.61
Grid xgboost MAPE:0.07
--------------------------------------------------

xgboost表现更加优秀。这里我只是随意调参,有兴趣的可以自己再调整一下参数。

总结一下:

从文章中提取特征非常重要。还可以尝试tf-idf等方式。

项目代码及数据集:

GitHub - shange1996/Projects-for-NLP

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值