python 词云图如何将字设置成正向
时间: 2024-03-13 15:46:06 浏览: 80
要将词云图中的字设置为正向,你可以使用 Python 中的词云库 wordcloud。在使用该库时,可以通过设置参数 `rotate_step` 将字体旋转角度设置为0,这样就可以使得字体始终朝向正向。
具体的实现代码如下:
```python
from wordcloud import WordCloud
# 生成词云图
wordcloud = WordCloud(background_color="white", width=800, height=600, margin=2, rotate_step=0).generate(text)
# 显示词云图
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")
plt.show()
```
其中,`rotate_step` 参数可以控制字体旋转的角度。如果设置为0,则表示不旋转字体,正向显示。
相关问题
根据提供的data.csv 附件(comment、star),用python语言对外卖评论进行分类,2分类,正向负向,两种方式:sklearn调用以及自己编写模型类。根据分类结果,分别画出正向词云图,负向词云图
好的,我会尽力回答你的问题。首先需要说明的是,我们需要在进行分类前对评论数据进行预处理,包括去除停用词、分词、词性标注等。这里我将使用Python中的nltk库进行预处理。
首先,我们需要安装nltk库,可以通过以下命令进行安装:
```python
!pip install nltk
```
安装完成后,我们可以通过以下代码对评论数据进行预处理:
```python
import pandas as pd
import nltk
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
from nltk.stem import WordNetLemmatizer
# 下载停用词
nltk.download('stopwords')
# 下载punkt
nltk.download('punkt')
# 下载wordnet
nltk.download('wordnet')
# 读取评论数据
data = pd.read_csv('data.csv')
# 定义停用词
stop_words = set(stopwords.words('english'))
# 初始化词性还原器
wordnet_lemmatizer = WordNetLemmatizer()
# 定义预处理函数
def preprocess(text):
# 分词
words = word_tokenize(text.lower())
# 去除停用词
words = [word for word in words if word not in stop_words]
# 词性还原
words = [wordnet_lemmatizer.lemmatize(word, pos='v') for word in words]
# 返回预处理后的评论
return " ".join(words)
# 对评论进行预处理
data['comment'] = data['comment'].apply(preprocess)
```
接下来,我们可以使用sklearn库中的TfidfVectorizer对评论进行特征提取,并使用LogisticRegression进行分类。具体代码如下:
```python
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
# 定义特征提取器
vectorizer = TfidfVectorizer()
# 提取特征
X = vectorizer.fit_transform(data['comment'])
# 定义标签
y = data['star'].apply(lambda x: 1 if x > 3 else 0)
# 划分训练集和测试集
train_size = int(len(data) * 0.8)
X_train, X_test, y_train, y_test = X[:train_size], X[train_size:], y[:train_size], y[train_size:]
# 定义分类器
clf = LogisticRegression()
# 训练分类器
clf.fit(X_train, y_train)
# 对测试集进行预测
y_pred = clf.predict(X_test)
# 输出分类报告
print(classification_report(y_test, y_pred))
```
除了使用sklearn库外,我们也可以自己编写模型类进行分类。这里我将使用PyTorch框架来编写模型类。具体代码如下:
```python
import torch
from torch import nn
from torch.utils.data import Dataset, DataLoader
from sklearn.metrics import classification_report
# 定义评论数据集类
class CommentDataset(Dataset):
def __init__(self, data, vectorizer):
self.data = data
self.vectorizer = vectorizer
def __len__(self):
return len(self.data)
def __getitem__(self, index):
comment = self.data.iloc[index]['comment']
star = self.data.iloc[index]['star']
features = self.vectorizer.transform([comment]).toarray().squeeze()
label = 1 if star > 3 else 0
return torch.Tensor(features), torch.Tensor([label])
# 定义分类模型类
class Classifier(nn.Module):
def __init__(self, input_size):
super(Classifier, self).__init__()
self.fc1 = nn.Linear(input_size, 128)
self.fc2 = nn.Linear(128, 64)
self.fc3 = nn.Linear(64, 2)
self.relu = nn.ReLU()
self.dropout = nn.Dropout(p=0.5)
def forward(self, x):
x = self.fc1(x)
x = self.relu(x)
x = self.dropout(x)
x = self.fc2(x)
x = self.relu(x)
x = self.dropout(x)
x = self.fc3(x)
return x
# 定义特征提取器
vectorizer = TfidfVectorizer()
# 定义评论数据集
dataset = CommentDataset(data, vectorizer)
# 划分训练集和测试集
train_size = int(len(data) * 0.8)
train_dataset, test_dataset = torch.utils.data.random_split(dataset, [train_size, len(dataset) - train_size])
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=32, shuffle=False)
# 初始化分类器
classifier = Classifier(input_size=train_dataset[0][0].shape[0])
# 定义优化器和损失函数
optimizer = torch.optim.Adam(classifier.parameters(), lr=0.001)
criterion = nn.CrossEntropyLoss()
# 训练分类器
for epoch in range(10):
for features, labels in train_loader:
optimizer.zero_grad()
outputs = classifier(features)
loss = criterion(outputs, labels.long())
loss.backward()
optimizer.step()
# 在测试集上进行评估
y_true = []
y_pred = []
with torch.no_grad():
for features, labels in test_loader:
outputs = classifier(features)
_, predicted = torch.max(outputs.data, 1)
y_true.extend(labels.numpy())
y_pred.extend(predicted.numpy())
print(classification_report(y_true, y_pred))
```
接下来,我们可以根据分类结果,分别画出正向词云图和负向词云图。具体代码如下:
```python
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
# 定义正向评论和负向评论
positive_comments = data[data['star'] > 3]['comment']
negative_comments = data[data['star'] <= 3]['comment']
# 定义正向词云图
positive_text = " ".join(positive_comments)
mask = np.array(Image.open('positive.png'))
wc = WordCloud(background_color='white', mask=mask)
wc.generate(positive_text)
plt.imshow(wc, interpolation='bilinear')
plt.axis('off')
plt.show()
# 定义负向词云图
negative_text = " ".join(negative_comments)
mask = np.array(Image.open('negative.png'))
wc = WordCloud(background_color='white', mask=mask)
wc.generate(negative_text)
plt.imshow(wc, interpolation='bilinear')
plt.axis('off')
plt.show()
```
这里需要注意的是,我们需要准备好正向词云图和负向词云图的模板图片(例如positive.png和negative.png),用于生成相应形状的词云图。
根据提供的data.csv附件,对外卖评论进行分类,2分类,正向负向,两种方式:sklearn调用以及自己编写模型类。根据分类结果,分别画出正向词云图,负向词云图
好的,那我先来介绍一下使用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调用和自己编写模型类的方式进行文本分类,并生成正向词云图和负向词云图的代码实现。
阅读全文