平时作业of彭宇昊
Signed-off-by: 彭宇昊 <13190710+yuhao-peng@user.noreply.gitee.com>
This commit is contained in:
@@ -0,0 +1,69 @@
|
|||||||
|
import pandas as pd
|
||||||
|
import re
|
||||||
|
import jieba
|
||||||
|
import pickle
|
||||||
|
from wordcloud import WordCloud#安装wordcloud要输入后面的那个,而不是前面的,就像安装opencv,要装cv2
|
||||||
|
from sklearn.naive_bayes import GaussianNB
|
||||||
|
from sklearn.model_selection import train_test_split
|
||||||
|
from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer
|
||||||
|
from sklearn.metrics import confusion_matrix
|
||||||
|
import seaborn as sns
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
plt.rcParams['font.sans-serif'] = 'SimHei'
|
||||||
|
plt.rcParams['axes.unicode_minus'] = False
|
||||||
|
data = pd.read_csv('message80W1.csv', header=None, index_col=0)
|
||||||
|
data.columns = ['label', 'message']
|
||||||
|
n = 5000
|
||||||
|
a = data[data['label'] == 0].sample(n)
|
||||||
|
b = data[data['label'] == 1].sample(n)
|
||||||
|
newdata = pd.concat([a, b], axis=0)
|
||||||
|
dupdata = newdata['message'].drop_duplicates()
|
||||||
|
qumindata = dupdata.apply(lambda x: re.sub('x', '', x))
|
||||||
|
# 读取自定义的分词词典
|
||||||
|
jieba.load_userdict('newdic1.txt')
|
||||||
|
data_cut = qumindata.apply(lambda x: jieba.lcut(x))
|
||||||
|
# 读取停用词表去停用词
|
||||||
|
stopWords = pd.read_csv('stopword.txt', encoding='GB18030', sep='hahaha', header=None)
|
||||||
|
stopWords = ['≮', '≯', '≠', '≮', ' ', '会', '月', '日', '–'] + list(stopWords.iloc[:, 0])
|
||||||
|
dataafterstop = data_cut.apply(lambda x: [i for i in x if i not in stopWords])
|
||||||
|
labels = newdata.loc[dataafterstop.index, 'label']
|
||||||
|
# join函数将分词后的数据转换为字符串
|
||||||
|
adata = dataafterstop.apply(lambda x: ' '.join(x))
|
||||||
|
# 划分数据集
|
||||||
|
data_tr, data_te, labels_tr, labels_te = train_test_split(adata, labels, test_size=0.15)
|
||||||
|
# 转词向量
|
||||||
|
countVectorizer = CountVectorizer()
|
||||||
|
# 训练集
|
||||||
|
data_tr = countVectorizer.fit_transform(data_tr)
|
||||||
|
X_tr = TfidfTransformer().fit_transform(data_tr.toarray()).toarray()
|
||||||
|
# 测试集
|
||||||
|
data_te = CountVectorizer(vocabulary=countVectorizer.vocabulary_).fit_transform(data_te)
|
||||||
|
X_te = TfidfTransformer().fit_transform(data_te.toarray()).toarray()
|
||||||
|
model = GaussianNB()
|
||||||
|
model.fit(X_tr, labels_tr)
|
||||||
|
pred = model.predict(X_te)
|
||||||
|
score = model.score(X_te, labels_te)
|
||||||
|
# 使用pickle模块保存模型
|
||||||
|
with open('model.pkl', 'wb') as f:
|
||||||
|
pickle.dump(model, f)
|
||||||
|
# 保存词向量模型
|
||||||
|
with open('countVectorizer.pkl', 'wb') as f:
|
||||||
|
pickle.dump(countVectorizer, f)
|
||||||
|
# 绘制混淆矩阵
|
||||||
|
sns.heatmap(confusion_matrix(labels_te,pred),annot=True)
|
||||||
|
plt.xlabel('Predicted')
|
||||||
|
plt.ylabel('True')
|
||||||
|
plt.title("混淆矩阵")
|
||||||
|
plt.show()
|
||||||
|
## 绘制词云
|
||||||
|
word_fre = {}
|
||||||
|
for i in dataafterstop[labels == 0]:
|
||||||
|
for j in i:
|
||||||
|
if j not in word_fre.keys():
|
||||||
|
word_fre[j] = 1
|
||||||
|
else:
|
||||||
|
word_fre[j] += 1
|
||||||
|
wc = WordCloud( background_color='white', font_path=r'C:/Windows/Fonts/STKAITI.TTF')#换一个长方形的边框,同时变成华文楷体
|
||||||
|
wc.fit_words(word_fre)
|
||||||
|
plt.imshow(wc)
|
||||||
|
plt.show()
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 16 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 192 KiB |
Reference in New Issue
Block a user