根据提供的data.csv附件,对外卖评论进行分类,2分类,正向负向,两种方式:sklearn调用以及自己编写模型类。根据分类结果,分别画出正向词云图,负向词云图
时间: 2023-12-09 17:02:58 浏览: 71
好的,那我先来介绍一下使用sklearn进行文本分类的步骤:
1. 提取文本特征,可以使用词袋(Bag of Words)模型或者TF-IDF(Term Frequency-Inverse Document Frequency)模型
2. 划分训练集和测试集
3. 选择分类器,可以使用朴素贝叶斯(Naive Bayes)、支持向量机(SVM)等
4. 训练模型,使用训练集进行训练
5. 预测测试集,评估模型性能
6. 使用模型进行预测
下面是使用sklearn进行文本分类的代码实现,包括提取文本特征、划分训练集和测试集、选择分类器、训练模型、预测测试集和评估模型性能:
```python
# 导入相关库
import pandas as pd
import jieba
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score
from wordcloud import WordCloud
import matplotlib.pyplot as plt
# 读取数据
data = pd.read_csv('data.csv')
# 分词
data['cut_comment'] = data['comment'].apply(lambda x: ' '.join(jieba.cut(x)))
# 提取文本特征
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(data['cut_comment'].values)
y = data['label'].values
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 选择分类器
clf = MultinomialNB()
# 训练模型
clf.fit(X_train, y_train)
# 预测测试集
y_pred = clf.predict(X_test)
# 评估模型性能
print('Accuracy:', accuracy_score(y_test, y_pred))
# 使用模型进行预测
comment = '这家店的菜很好吃,服务也很好,下次还会来'
cut_comment = ' '.join(jieba.cut(comment))
X_new = vectorizer.transform([cut_comment])
y_new = clf.predict(X_new)
print('预测结果:', y_new[0])
# 生成正向词云图
pos_words = ' '.join(data[data['label'] == 1]['cut_comment'])
pos_wordcloud = WordCloud(background_color='white', width=800, height=600, font_path='simhei.ttf').generate(pos_words)
plt.imshow(pos_wordcloud)
plt.axis('off')
plt.show()
# 生成负向词云图
neg_words = ' '.join(data[data['label'] == 0]['cut_comment'])
neg_wordcloud = WordCloud(background_color='white', width=800, height=600, font_path='simhei.ttf').generate(neg_words)
plt.imshow(neg_wordcloud)
plt.axis('off')
plt.show()
```
上述代码中,我们使用了sklearn库中的TfidfVectorizer类对文本进行特征提取,使用了MultinomialNB类作为分类器,使用了train_test_split函数划分训练集和测试集,使用了accuracy_score函数评估模型的性能,使用了WordCloud库生成词云图。
如果您要使用自己编写模型类的方式进行文本分类,可以参考以下代码:
```python
# 导入相关库
import pandas as pd
import jieba
import numpy as np
from wordcloud import WordCloud
import matplotlib.pyplot as plt
# 定义朴素贝叶斯模型类
class NaiveBayes:
def __init__(self):
self.total = None # 所有单词的总数
self.pos_total = None # 正向评论的总数
self.neg_total = None # 负向评论的总数
self.pos_dict = None # 正向评论中每个单词出现的次数
self.neg_dict = None # 负向评论中每个单词出现的次数
self.pos_prob = None # 正向概率
self.neg_prob = None # 负向概率
# 训练模型
def train(self, X_train, y_train):
self.total = 0
self.pos_total = 0
self.neg_total = 0
self.pos_dict = {}
self.neg_dict = {}
# 统计正向评论和负向评论中每个单词出现的次数
for i in range(X_train.shape[0]):
words = X_train[i].split()
label = y_train[i]
self.total += len(words)
if label == 1:
self.pos_total += len(words)
for word in words:
if word not in self.pos_dict:
self.pos_dict[word] = 1
else:
self.pos_dict[word] += 1
else:
self.neg_total += len(words)
for word in words:
if word not in self.neg_dict:
self.neg_dict[word] = 1
else:
self.neg_dict[word] += 1
# 计算正向概率和负向概率
self.pos_prob = self.pos_total / self.total
self.neg_prob = self.neg_total / self.total
# 预测测试集
def predict(self, X_test):
y_pred = []
for i in range(X_test.shape[0]):
words = X_test[i].split()
pos_score = np.log(self.pos_prob)
neg_score = np.log(self.neg_prob)
for word in words:
if word in self.pos_dict:
pos_score += np.log((self.pos_dict[word] + 1) / (self.pos_total + len(self.pos_dict)))
else:
pos_score += np.log(1 / (self.pos_total + len(self.pos_dict)))
if word in self.neg_dict:
neg_score += np.log((self.neg_dict[word] + 1) / (self.neg_total + len(self.neg_dict)))
else:
neg_score += np.log(1 / (self.neg_total + len(self.neg_dict)))
if pos_score > neg_score:
y_pred.append(1)
else:
y_pred.append(0)
return y_pred
# 读取数据
data = pd.read_csv('data.csv')
# 分词
data['cut_comment'] = data['comment'].apply(lambda x: ' '.join(jieba.cut(x)))
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(data['cut_comment'].values, data['label'].values, test_size=0.2, random_state=42)
# 训练模型
clf = NaiveBayes()
clf.train(X_train, y_train)
# 预测测试集
y_pred = clf.predict(X_test)
# 评估模型性能
print('Accuracy:', accuracy_score(y_test, y_pred))
# 使用模型进行预测
comment = '这家店的菜很好吃,服务也很好,下次还会来'
cut_comment = ' '.join(jieba.cut(comment))
X_new = np.array([cut_comment])
y_new = clf.predict(X_new)
print('预测结果:', y_new[0])
# 生成正向词云图
pos_words = ' '.join(data[data['label'] == 1]['cut_comment'])
pos_wordcloud = WordCloud(background_color='white', width=800, height=600, font_path='simhei.ttf').generate(pos_words)
plt.imshow(pos_wordcloud)
plt.axis('off')
plt.show()
# 生成负向词云图
neg_words = ' '.join(data[data['label'] == 0]['cut_comment'])
neg_wordcloud = WordCloud(background_color='white', width=800, height=600, font_path='simhei.ttf').generate(neg_words)
plt.imshow(neg_wordcloud)
plt.axis('off')
plt.show()
```
上述代码中,我们定义了一个NaiveBayes类来实现朴素贝叶斯模型,使用了train函数训练模型,使用了predict函数预测测试集,使用了accuracy_score函数评估模型的性能,使用了WordCloud库生成词云图。
以上是使用sklearn调用和自己编写模型类的方式进行文本分类,并生成正向词云图和负向词云图的代码实现。
阅读全文