文字模型训练,尤其是在自然语言处理(NLP)领域,是构建能够理解、解释、生成人类语言系统的核心步骤。这类模型广泛应用于文本分类、情感分析、机器翻译、聊天机器人、摘要生成等多个方面。针对文字模型训练后的分析评论,可以从以下几个方面进行:
1. 性能评估
- 准确率/错误率:评估模型在测试集上的准确率或错误率是最直接的方式,这能反映模型的基本性能。
- 混淆矩阵:对于分类任务,混淆矩阵可以详细展示模型在各个类别上的表现,包括真正例(TP)、假正例(FP)、真反例(TN)、假反例(FN)的数量。
- F1分数:结合了精确率和召回率的指标,对于不平衡数据集尤其有用,能够更全面地评估模型性能。
- ROC曲线与AUC值:用于二分类问题,ROC曲线下的面积(AUC)值越高,表示模型性能越好。
2. 模型泛化能力
- 交叉验证:通过多次划分训练集和验证集来评估模型在不同数据子集上的表现,有助于了解模型的稳定性和泛化能力。
- 过拟合与欠拟合:分析模型在训练集和验证集上的性能差异,判断是否存在过拟合(训练集表现优异但验证集表现差)或欠拟合(两者都差)问题。
3. 文本理解与生成质量
- 语义连贯性:对于生成类任务(如文本摘要、机器翻译),评估生成文本的语义是否连贯,是否符合逻辑。
- 多样性:检查生成文本是否具有丰富的多样性,避免单调重复。
- 语境适应性:评估模型在不同语境下的表现,确保能够准确理解并适应不同的语言环境和文化背景。
4. 效率与资源消耗
- 训练时间:记录并比较不同模型或配置下的训练时间,评估训练效率。
- 资源消耗:包括计算资源(CPU、GPU等)和内存消耗,对于实际应用中的部署成本有重要影响。
5. 实际应用反馈
- 用户满意度:收集真实用户的使用反馈,了解模型在实际应用中的表现,包括易用性、准确性等方面的评价。
- 持续改进:基于用户反馈和实际应用中的问题,不断优化模型,提升性能。
*废话不说了,直接实战:
python
import pandas as pd
#利用爬虫提取数据
cp_content = pd.read_table("./差评.txt", encoding='utf8')
yzpj_content = pd.read_table("./优质好评.txt", encoding='utf8')
import jieba#导入库
cp_segments = []
contents = cp_content.content.values.tolist()
for content in contents:
results = jieba.lcut(content)
if len(results) > 1: # 当分词之后,这条评论如果只有1个内容,
cp_segments.append(results) # 将分词后的内容添加到列表segments中
cp_fc_results = pd.DataFrame({'content': cp_segments})
cp_fc_results.to_excel('cp_fc_results.xlsx', index=False)
# B:对优质评价分词
yzpj_segments = []
contents = yzpj_content.content.values.tolist() # 将content列数据取出并转化为list格式。目的是分别 jieba.lcut分词
for content in contents:
results = jieba.lcut(content)
if len(results) > 1:
yzpj_segments.append(results) ##将分词后的内容添加到列表segments中
# 分词结果储存在新的数据框中
yzpj_fc_results = pd.DataFrame({'content': yzpj_segments})
yzpj_fc_results.to_excel('yzpj_fc_results.xlsx', index=False)
# 导入停用词库
stopwords = pd.read_csv(r"./红楼梦/StopwordsCN.txt", encoding='utf8', engine='python', index_col=False)
# 定义去除停用词函数
def drop_stopwords(contents, stopwords):
segments_clean = []
for content in contents:
line_clean = []
for word in content:
if word in stopwords:
continue
line_clean.append(word)
segments_clean.append(line_clean)
return segments_clean
# 调用去除停用词函数
contents = cp_fc_results.content.values.tolist() # DataFrame格式转为list格式
stopwords = stopwords.stopword.values.tolist() # 停用词转为list格式
cp_fc_contents_clean_s = drop_stopwords(contents, stopwords)
contents = yzpj_fc_results.content.values.tolist() # DataFrame格式转为list格式
yzpj_fc_contents_clean_s = drop_stopwords(contents, stopwords)
cp_train = pd.DataFrame({'segments_clean':cp_fc_contents_clean_s, 'label':1})
yzpj_train = pd.DataFrame({'segments_clean':yzpj_fc_contents_clean_s, 'label':0})
pj_train = pd.concat([cp_train,yzpj_train])
pj_train.to_excel('pj_train.xlsx',index=False)
from sklearn.model_selection import train_test_split
# 数据切分 :训练集特征、测试集特征、训练集标签、测试集标签
x_train,x_test,y_train,y_test = \
train_test_split(pj_train['segments_clean'].values,
pj_train['label'].values, random_state=0)
words = [] #将所有的词转换为词向量
for line_index in range(len(x_train)):
words.append(''.join(x_train[line_index]))
print(words)
from sklearn.feature_extraction.text import CountVectorizer
vec = CountVectorizer(max_features=4000, lowercase=False, ngram_range=(1,1))
#lowercase参数的功能:把所有的词是是否需要转换为小写。False。
#max_features:表示只提取前4000个词作为词库。
vec.fit(words)
from sklearn.naive_bayes import MultinomialNB,ComplementNB
#导入朴素贝叶斯分类器
classifier = MultinomialNB(alpha =0.1)
classifier.fit(vec.transform(words),y_train)
train_pr = classifier.predict(vec.transform(words))
from sklearn import metrics
print(metrics.classification_report(y_train, train_pr))#测试集数据进行分析
test_words = []
for line_index in range(len(x_test)):
test_words.append("".join(x_test[line_index]))
test_pr = classifier.predict(vec.transform(test_words))
print(metrics.classification_report(y_test, test_pr))
s = '这玩意真好,我很喜欢'#检验结果自动判断这句话到底是好评还是差评???
#2、构建成词向量转换的标准格式
str = ''
seg_list = jieba.lcut(s)
stopwards = pd.read_csv('./红楼梦/StopwordsCN.txt', encoding='utf8',engine='python', index_col=False)
for seg in seg_list:
if seg not in stopwards.stopword:
str += seg + ' '
# 3、进行词向量转换
str_text = ' '.join(str)
predicted_label = classifier.predict(vec.transform([str_text]))[0]
if predicted_label == 0:
print("预测为优质评价")
else:
print("预测为差评")