【Python自然语言处理】文本向量化处理用户对不同类型服装评论问题(超详细 附源码)

news2024/9/20 14:53:22

需要源码和数据集请点赞关注收藏后评论区留言私信~~~

下面以文本向量化为目标,举例说明基于不同模型的实现过程,使用的数据集的主题是用户对不同类型的女性服装的评论,总共有23485条记录 实现步骤如下

一、导入库文件

首先导入需要的库文件,本实例设计词频-逆文档模型,N元模型以及词袋模型,并利用混淆矩阵直观描述各模型的预测能力 代码如下

import gensim
import nltk
from sklearn.model_selection import train_test_split
from sklearn import linear_model
from sklearn.neighbors import KNeighborsClassifier
from sklearn import linear_model
from nltk.corpus import stopwords
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.metrics import accuracy_score, confusion_matrix
import matplotlib.pyplot as plt
from gensim.models import Word2Vec
import logging
from smart_open import smart_open
import pandas as pd
import numpy as np
from numpy import random

二、数据清洗 

读入评论数据,删除空值,以空格符为基准对用户评论进行统计,针对数据的评论列进行分类统计,只分析用户关注度高且排名前五的用户评论,得到分类统计的图形比较结果如下

 

 三、配置混淆矩阵

定义混淆矩阵以及参数设置并设定图形输出的主要特征 代码如下

def confusion_matrix_definition(cm, title='混淆矩阵', cmap=plt.cm.Purples,ax=ax):
    plt.imshow(cm, interpolation='nearest', vmin = -1, vmax = 1, cmap=cmap, origin ='lower')
    plt.title(title,fontweight ="bold")
    plt.colorbar(plt.imshow(cm, interpolation='nearest', cmap=cmap, origin ='lower'))
    length = np.arange(len(categories))
    plt.xticks(length, categories, rotation=45)
    plt.yticks(length, categories)
    plt.rcParams['font.sans-serif']=['Microsoft YaHei']
    plt.rcParams['font.size']=14
    plt.rcParams['axes.unicode_minus'] = False
    plt.ylabel('真实值')
    plt.xlabel('预测值')
    #plt.tight_layout()
    plt.show()

四、预测结果

评估预测结果,通过正则化混淆矩阵方式显示预测值和期望值之间的关系,以客户评论数据为预测对象,选取排名前五的女性服饰类型,调用评估预测函数得到评估结果,并且剔除长度不符合要求的数据

五、结果展示

词袋模型结果

 

 由上图可知,对角线上的值表示正确分类的结果,颜色越深数字越大,分类结果越正确,非对角线上的值表示模型错误分类结果,颜色越深数值越大,被错误分类的概率越大,可见模型对Sweaters类型的预测分类结果准确性最高,其他略低。 

N元模型结果 

N元模型的混淆矩阵评估结果如下图,分类最为准确的依然是Sweaters,其次是Blouses,而其他三种类型的预估结果比较接近,整个模型的准确性比词袋模型高,可以达到差不多0.7

词频-逆文档频率模型 

词频-逆文档模型评估结果如下 预测精度的顺序基本没有改变

六、总结 

从上面的实例中可以看出,分别使用三种文本向量评估模型,Sweaters的分类结果相对准确,Blouses准确性次之,而其他三种准确性相差不大,模型整体准确率而言,从高到低的顺序依次为N元模型,词袋模型以及词频-逆文档模型,因此针对不同的文本信息处理,不同的模型可能在评价结果的准确性排序上存在一定差异,准确性精度也可能有所区别

七、代码





#导入各类库
import gensim
import nltk
from sklearn.model_selection import train_test_split
from sklearn import linear_model
from sklearn.neighbors import KNeighborsClassifier
from sklearn import linear_model
from nltk.corpus import stopwords
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.metrics import accuracy_score, confusion_matrix
import matplotlib.pyplot as plt
from gensim.models import Word2Vec
import logging
from smart_open import smart_open
import pandas as pd
import numpy as np
from numpy import random


get_ipython().run_line_magic('matplotlib', 'inline')


# 统计数据特征
# 
# 

# In[2]:


#读入数据
df = pd.read_csv('data/Reviews.csv')
df = df.dropna()
df['review'].apply(lambda y: len(y.split(' '))).sum()


# In[3]:


#分类
#categories = ['Intimates' , 'Dresses', 'Pants', 'Blouses', 'Knits', 'Lounge', 'Jackets', 'Outwear','Skirts', 'Swim', 'Sleep','Fine gauge','Trend','Jeans','Blouses','Casual bottoms','Chemises','Layering','Legwear','Shorts']

categories = ['Dresses', 'Knits', 'Blouses', 'Sweaters', 'Pants']


df=df.groupby('category').filter(lambda x : len(x)>1000)
#df=df.groupby(["category"]).get_group("Dresses", "Knits")

#df=df[df['category'].value_counts()<1000]


ax =df.category.value_counts().head(5).plot(kind="bar",figsize=(30,12),fontsize=35)
ax.set_xlabel("服装类型",fontsize=35,fontfamily='Microsoft YaHei')
ax.set_ylabel("频率统计",fontsize=35,fontfamily='Microsoft YaHei')
#df=df['category'].value_counts(ascending=False).loc[lambda x : x>1000]
print(df)


# In[4]:


#df


# In[5]:


def plot(indx):
    inx = df[df.index == indx][['review', 'category']].values[0]
    if len(inx) > 5:
        print(inx[0])
        print('Type:', inx[1])


# In[6]:


train_data, test_data = train_test_split(df, test_size=0.2, random_state=32)


# In[7]:


len(test_data)


# In[8]:


plt.figure(figsize=(30, 10))
test_data.category.value_counts().head(5).plot(kind="bar", figsize=(30,12),fontsize=35)

print(test_data)
print(test_data['review'])


# ## Model evaluation approach
# We will use confusion matrices to evaluate all classifiers

# In[9]:


def confusion_matrix_definition(cm, title='混淆矩阵', cmap=plt.cm.Purples,ax=ax):
    plt.imshow(cm, interpolation='nearest', vmin = -1, vmax = 1, cmap=cmap, origin ='lower')
    plt.title(title,fontweight ="bold")
    plt.colorbar(plt.imshow(cm, interpolation='nearest', cmap=cmap, origin ='lower'))
    length = np.arange(len(categories))
    plt.xticks(length, categories, rotation=45)
    plt.yticks(length, categories)
    plt.rcParams['font.sans-serif']=['Microsoft YaHei']
    plt.rcParams['font.size']=14
    plt.rcParams['axes.unicode_minus'] = False
    plt.ylabel('真实值')
    plt.xlabel('预测值')
    #plt.tight_layout()
    plt.show()




# In[10]:


def predict_appraise(predict, mark, title="混淆矩阵"):
    print('准确率: %s' % accuracy_score(mark, predict))
    cm = confusion_matrix(mark, predict)
    
    N = len(cm[0])
    for i in range(N // 2):
        for j in range(i, N - i - 1):
            temp = cm[i][j]
            cm[i][j] = cm[N - 1 - j][i]
            cm[N - 1 - j][i] = cm[N - 1 - i][N - 1 - j]
            cm[N - 1 - i][N - 1 - j] = cm[j][N - 1 - i]
            cm[j][N - 1 - i] = temp

    print('混淆矩阵:\n %s' % cm)
    print('(行=期望值, 列=预测值)')
    
    for i in range(N // 2):
        for j in range(i, N - i - 1):
            temp = cm[i][j]
            cm[i][j] = cm[N - 1 - j][i]
            cm[N - 1 - j][i] = cm[N - 1 - i][N - 1 - j]
            cm[N - 1 - i][N - 1 - j] = cm[j][N - 1 - i]
            cm[j][N - 1 - i] = temp
    
    
    cmn = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]
    fig, ax = plt.subplots(figsize=(6, 6))
    confusion_matrix_definition(cmn, "正则化混淆矩阵")


# In[11]:


def predict(vectorizer, classifier, data):
    vt = vectorizer.transform(data['review'])
    forecast = classifier.predict(vt)
    mark = data['category']
    predict_appraise(forecast, mark)


# ### Bag of words

# In[12]:


def tokenization(text):
    list = []
    for k in nltk.sent_tokenize(text):
        for j in nltk.word_tokenize(k):
            if len(j) < 5:
                continue
            list.append(j.lower())
    return list


# In[13]:


get_ipython().run_cell_magic('time', '', '#文本特征向量化\nbow  = CountVectorizer(\n    analyzer="word",  encoding=\'utf-8\',tokenizer=nltk.word_tokenize,\n    preprocessor=None, decode_error=\'strict\', strip_accents=None,stop_words=\'english\', max_features=4200) \ntrain_data_features = bow.fit_transform(train_data[\'review\'])\n#print(bow.get_feature_names())\n')


# In[14]:


get_ipython().run_cell_magic('time', '', "\nreg = linear_model.LogisticRegression(n_jobs=1, C=1e7)\nreg = reg.fit(train_data_features, train_data['category'])\n")


# In[15]:


bow.get_feature_names()[80:90]


# In[16]:


get_ipython().run_cell_magic('time', '', '\npredict(bow, reg, test_data)\n')


# In[17]:


def words_impact_evaluate(vectorizer, genre_index=0, num_words=10):
    features = vectorizer.get_feature_names()
    max_coef = sorted(enumerate(reg.coef_[genre_index]), key=lambda x:x[1], reverse=True)
    return [features[x[0]] for x in max_coef[:num_words]]    


# In[18]:


# words for the fantasy genre
id = 1
print(categories[id])
words_impact_evaluate(bow,id)


# In[19]:


train_data_features[0]


# ### Character N-grams

# In[1]:


get_ipython().run_cell_magic('time', '', 'n_gram= CountVectorizer(\n    analyzer="char",\n    ngram_range=([3,6]),\n    tokenizer=None,    \n    preprocessor=None,                               \n    max_features=4200) \n\nreg = linear_model.LogisticRegression(n_jobs=1, C=1e6)\n\ntrain_data_features = n_gram.fit_transform(train_data[\'review\'])\n\nreg = reg.fit(train_data_features, train_data[\'category\'])\n')


# In[2]:


n_gram.get_feature_names()[70:90]


# In[3]:


predict(n_gram, reg, test_data)


# ### TF-IDF
# 
# 

# In[4]:


get_ipython().run_cell_magic('time', '', "tf_idf = TfidfVectorizer(\n    min_df=2, tokenizer=nltk.word_tokenize,\n    preprocessor=None, stop_words='english')\ntrain_data_features = tf_idf.fit_transform(train_data['review'])\n\nreg = linear_model.LogisticRegression(n_jobs=1, C=1e6)\nreg = reg.fit(train_data_features, train_data['category'])\n")


# In[5]:


tf_idf.get_feature_names()[1000:1010]


# In[6]:


predict(tf_idf, reg, test_data)


# In[ ]:


words_impact_evaluate(tf_idf, 1)

 创作不易 觉得有帮助请点赞关注收藏~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/62072.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL数据库日志、备份与恢复

目录 前言 一.MySQL 日志管理 数据的重要性 造成数据丢失的原因 1、错误日志 2、通用查询日志 3、二进制日志 4、慢查询日志 5、查看日志 6.中继日志&#xff08;relay log&#xff09; 7、普通日志&#xff08;general log&#xff09; 配置文件 二、数据库备份的…

Metabase学习教程:系统管理-4

序列化&#xff1a;在Metabase实例间迁移 如何使用Metabase的序列化功能将问题、仪表板、集合、设置等从一个Metabase实例复制到新的Metabase实例。 Metabase序列化 序列化仅在商业版上可用&#xff08;仅在自托管计划上&#xff09;。 许多客户在迁移到本地部署的商业版时…

二叉树OJ题详解

第一题&#xff1a;单值二叉树 力扣链接&#xff1a;力扣 单值二叉树就是每一个节点存放的数据都相同&#xff0c;那么如何判断一棵树为单值二叉树呢&#xff1f;我们就拿最简单的一棵树为例子&#xff0c;比如根节点为1它的左子树和右子树也为1的一棵树&#xff0c;我们只需要…

以太网 TCP协议(TCP报文交互后的状态机变化)

2.7.2 以太网 TCP协议&#xff08;TCP报文交互后的状态机变化&#xff09; 一、TCP状态机&#xff1a; 二、TCP状态机变化 1、TCP三次握手 客户端主动发起SYN置位TCP之后&#xff0c;状态变为SYN_SENT(请求发送状态)服务器默认处于LISTEN(监听状态)。收到SYN报文之后&#x…

VMwareWorkStation如何添加万兆网卡,万兆网卡添加教程

1.引言 不同于ESXi&#xff0c;在VMware WorkStation&#xff08;后文简称VMware&#xff09;中添加网卡后没有选择网卡速度等级的选项&#xff0c;例如百兆、千兆、万兆等。就算点开右下角的”高级“也不管用。不过按照VMware的默认设定&#xff0c;当新建虚拟机选择32位操作系…

【玩转STL】STL的简介和string类用法和接口讲解(源码解析)

接触编程时间长一点的朋友想必都多多少少听过vector、string、queue等容器&#xff0c;也大抵了解一些有关STL的概念&#xff0c;这一节&#xff0c;我们就一起来谈一谈STL的六大组件&#xff0c;再来一起深入理解string类。 这里写目录标题&#x1f34e;、什么是STL&#xff0…

人工智能:语音合成技术介绍

❤️作者主页&#xff1a;IT技术分享社区 ❤️作者简介&#xff1a;大家好,我是IT技术分享社区的博主&#xff0c;从事C#、Java开发九年&#xff0c;对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉&#xff1a; 数据库领域优质创作者&#x1f3c6;&#x…

PCL 点云采样

一、简介 点云采样一般有三种方式&#xff0c;上采样&#xff0c;下采样&#xff0c;平均采样 原理介绍 下采样&#xff1a; 一般是采样是通过构建一个三维体素的格栅&#xff0c;然后在每个体素内用体素的重心近似的作为这个体素的整体特征&#xff0c;也就是说用这一个体素…

python 拆分pdf(有可执行文件exe)

1.背景 被那些软件pdf拆分整气死了&#xff0c;今天用python写一份pdf拆分的代码。 2.代码&#xff1a;&#xff08;计算机的可以去学习一下&#xff0c;自己改改&#xff09; pdf_split.py from PyPDF2 import PdfFileReader, PdfFileWriter# PDF文件分割 def split_pdf():…

pytorch nn.utils.rnn.pack_padded_sequence 分析

pack_padded_sequence 在nlp模型的forward方法中&#xff0c;可能有以下调用令读者疑惑 packed_embedded nn.utils.rnn.pack_padded_sequence(embedded, text_lengths, batch_firstTrue, enforce_sortedFalse)为什么要使用pack_padded_sequence&#xff1f; 参考 Pytorch中…

TDengine3.0:解决高基数问题的时序数据库设计思路

小 T 导读&#xff1a; 数据集的高基数&#xff08;High-Cardinality&#xff09;问题一直困扰着诸多主流的时序数据库&#xff08;Time Series Database&#xff0c;TSDB&#xff09;产品。一些数据库管理系统&#xff0c;在基数较低时表现良好&#xff1b;但是随着基数的增加…

vue2.x与vue3.x中自定义指令详解

&#x1f431;个人主页&#xff1a;不叫猫先生 &#x1f64b;‍♂️作者简介&#xff1a;前端领域新星创作者、华为云享专家、阿里云专家博主&#xff0c;专注于前端各领域技术&#xff0c;共同学习共同进步&#xff0c;一起加油呀&#xff01; &#x1f4ab;系列专栏&#xff…

m基于GA遗传算法的分件供送螺杆参数优化matlab仿真,优化参数包括螺杆总尺寸-最大圈数等

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 首先介绍MATLAB部分的遗传算法的优化算法介绍&#xff1a; 遗传算法的原理 遗传算法GA把问题的解表示成“染色体”&#xff0c;在算法中也即是以二进制编码的串。并且&#xff0c;在执行遗传算法…

AI 对话模型被网友玩坏了!这次还可以运行 Docker 容器...

最近一款新的聊天 AI 被网友们玩疯了。它可以直接生成代码、可以给你的代码 debug 以及提出优化...可以模仿莎士比亚风格写作...还可以解答各种各样的问题&#xff0c;而且显然不只 10 岁小孩子的智商&#xff0c;感觉它已经把互联网上所有的公开资料都吸收并消化了。这就是 Op…

mssql(1433端口)介绍

mssql介绍 Microsoft SQL Server是一个关系型数据库&#xff0c;微软开发的管理系统。作为数据库服务器&#xff0c;它是一种软件产品&#xff0c;其主要功能是存储和检索其他软件应用程序所请求的数据&#xff0c;这些应用程序可以运行在同一台计算机上&#xff0c;也可以运行…

Java连接数据库(JDBC非常重要)

目录 一.数据库连接 1.1之前如何操作数据库 1.2.实际开发中如何操作数据库&#xff1f; 二.JDBC(Java Database Connectinity)(重要) 2.1.JDBC的概念 2.2 JDBC核心思想 2.2.1 MySQL数据库驱动 2.2.2 JDBC API 2.3JDBC 环境搭建 2.4准备一张表 2.4.1 创建student表 2.4.…

[附源码]Python计算机毕业设计Django三星小区车辆登记系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Json简介与基本使用

前言 本文为Json简介与基本使用相关知识&#xff0c;下边具体将对什么是JSON&#xff0c;XML与JSON的区别&#xff0c;JSON的语法格式&#xff0c;JSON数据的转换&#xff08;包括&#xff1a;Java对象转换为JSON格式、JSON格式转换为Java对象&#xff09;等进行详尽介绍~ &am…

学习 MySQL:什么是分页

在本文中&#xff0c;我将解释在MySQL中&#xff0c;什么是分页以及我们如何实现它。当我们从 MySQL 数据库填充大型数据集时&#xff0c;读取同一页面上的所有记录并不容易。使用分页&#xff0c;我们可以将结果集划分为多个页面&#xff0c;这增加了结果集的可读性。在本文中…

协议-序列化-http-Cookie-Session-https

文章目录再谈协议什么是序列化&#xff0c;什么是反序列化&#xff1f;为什么要进行序列化和反序列化&#xff1f;怎么进行序列化和反序列化呢&#xff1f;网络计算器版本总结http协议httpurlencode&urldecode一. 格式认识二 代码实现一个http协议下的服务器安装telnet服务…