目录

  • 一、概念
  • 二、二分类实战-划分好评/差评
    • 1.处理步骤
    • 2.实战代码

一、概念

文本分类一般可以分为二分类、多分类、多标签分类三种情况。

  • 二分类是指将一组文本分成两个类(0或1),比较常见的应用如垃圾邮件分类、电商网站的用户评价数据的正负面分类等,
  • 多分类是指将文本分成若干个类中的某一个类,比如说门户网站新闻可以归属到不同的栏目中(如政治、体育、社会、科技、金融等栏目)去。
  • 多标签分类指的是可以将文本分成若干个类中的多个类,比如一篇文章里即描写政治又描写金融等内容,那么这篇文章可能会别贴上政治和金融两个标签。

二、二分类实战-划分好评/差评

1.处理步骤

  1. 将原始语料切词并过滤停用词
  2. 词向量初始化
  3. 构建模型并训练
  4. 测试

2.实战代码

1. 语料获取

本示例所用语料为某外卖平台用户的评论,共11987条样本数据, 其中正向评论样本4000条, 负向评论样本7987条
语料 waimai_10k.csv和停用词文本 stopwords.txt 的链接:https://pan.baidu.com/s/1WBJRCEDPJvJKdTFMYI_-JA?pwd=usz0

2.文本预处理

import jieba
import gensim# 加载停用词
def stop_words(path='stopwords.txt'):with open(path,'r',encoding='gbk',errors='ignore') as f:return[l.strip() for l in f]if __name__ == '__main__':# 加载停用词stop_words = stop_words()# 读取文件df = pd.read_csv("waimai_10k.csv")# 切词并过滤调停用词df["review"] = df["review"].map(lambda x: " ".join([i for i in jieba.cut(x) if i not in stop_words]))# 保存处理好的文本df.to_csv("waimai.csv", index=False, header=False, columns=["label","review"])

处理后的waimai.csv 如下:

3.词向量初始化

import pandas as pd
import gensim#词向量初始化
if __name__ == '__main__':df = pd.read_csv("waimai.csv", header=None)sentences = df.iloc[:, 1].astype("str").map(lambda x: x.split(" "))# vector_size (int, optional) – word向量的维度。# min_count (int, optional) – 忽略词频小于此值的单词。# workers (int, optional) – 训练模型时使用的线程数。model = gensim.models.Word2Vec(sentences, vector_size=128, workers=4, min_count=0)model.wv.save_word2vec_format('word_vec.txt', binary=False)

将词语转化为128维的向量
word_vec.txt 如下

4.模型训练及测试
先执行train()训练模型并保存,再执行之后的逻辑测试

# 模型搭建
import sys
from collections import defaultdictimport jieba
import gensim
import numpy as np
import pandas as pd
import tensorflow as tf
from tensorflow import keras
from sklearn.model_selection import train_test_split# 建立一个字典(词-索引的映射), 一个表(索引-词向量的矩阵)
def build_embeddings_matrix(word_vec_model):# 初始化词向量矩阵embeddings_matrix = np.random.random((len(word_vec_model.key_to_index)+1, 128))# 初始化词索引字典word_index = defaultdict(dict)for index, word in enumerate(word_vec_model.index_to_key):word_index[word] = index + 1# 预留0行给查不到的词embeddings_matrix[index+1] = word_vec_model.get_vector(word)return word_index, embeddings_matrix# 生成三组数据集(训练集, 验证集, 测试集)
def train_data(word_index):df = pd.read_csv("waimai.csv", names=["label","review"])df["word_index"] = df["review"].astype("str").map(lambda x: np.array([word_index.get(i, 0) for i in x.split(" ")]))# 填充及截断train = keras.preprocessing.sequence.pad_sequences(df["word_index"].values, maxlen=20, padding='post', truncating='post', dtype="float32")x_train, x_test, y_train, y_test = train_test_split(train, df["label"].values, test_size=0.2, random_state=1)# 从训练集上分出验证集x_train, x_val, y_train, y_val = train_test_split(x_train, y_train, test_size=0.15)return x_train, x_val, x_test, y_train, y_val, y_test# 构建模型
def build_model(word_index, embeddings_matrix):model = keras.models.Sequential()model.add(keras.layers.Embedding(input_dim=len(word_index)+1, output_dim=128, weights=[embeddings_matrix],input_length=20,trainable=False))model.add(keras.layers.GlobalAveragePooling1D())model.add(keras.layers.Dense(32, activation=tf.nn.relu))model.add(keras.layers.Dense(1, activation=tf.nn.sigmoid))model.compile(optimizer=tf.keras.optimizers.Adam(),loss='binary_crossentropy',metrics=['accuracy'])model.summary()return model#训练
def train():# 加载词向量word_vec_model = gensim.models.KeyedVectors.load_word2vec_format("word_vec.txt", binary=False)word_index,embeddings_matrix=build_embeddings_matrix(word_vec_model)x_train, x_val, x_test, y_train, y_val, y_test=train_data(word_index)model=build_model(word_index, embeddings_matrix)#训练,迭代50次model.fit(x_train, y_train, epochs=100, validation_data=(x_val, y_val))#评估,在测试集上进行效果评估results = model.evaluate(x_test, y_test)print(f"损失:{results[0]}, 准确率:{results[1]}")#保存模型model.save_weights('model/waimai_model')if __name__ == '__main__':#train()word_vec_model = gensim.models.KeyedVectors.load_word2vec_format("word_vec.txt", binary=False)word_index, embeddings_matrix = build_embeddings_matrix(word_vec_model)model = build_model(word_index, embeddings_matrix)model.load_weights("model/waimai_model")while True:text = input("请输入一句话:")text = [word_index.get(word, 0) for word in jieba.cut(text)]text = keras.preprocessing.sequence.pad_sequences([text], maxlen=20, padding='post', truncating='post', dtype="float32")res = model.predict(text)[0][0]if res >= 0.5:print(f"好评, 得分:{res*100}")else:print(f"差评,得分:{res*100}")print()

结果:

请输入一句话: 一般般把,不太好吃差评,得分: 17.57701188325882请输入一句话: 快递小哥速度快的一批,饭又好吃,赞赞赞!好评, 得分: 62.355756759643555

NLP-二分类的应用-区分外卖评论好评/差评相关推荐

  1. 造谣“外卖员因差评杀人” 女子被依法刑事拘留

    [TechWeb]1月30日消息,海淀公安分局今天中午发布通报称,近日,微博用户"鱼酱"发布海淀区发生外卖员因获差评杀人案件的虚假消息,引发公众关注.1月30日,嫌疑人张某已被海淀 ...

  2. 【NLP文本分类】对IMDB电影评论进行情感分析

    概述 对imdb中的电影评论进行分类,是一个二分类的问题,这是一种重要且广泛适用的机器学习问题. 数据 imdb的数据包含50000条电影评论.拥有25000条训练数据以及25000条评估数据,有着相 ...

  3. vue外卖二十一:商家详情-评价列表-条件过滤显示评价:只显示好评/差评+显示只带内容评价、用getters生成好评数量新状态

    一.基本数据标识设计shop/ratings/ratings.vue 1)data数据设计 data(){return{showText:true, //条件1:只显示带文字的评价ratingType ...

  4. 似外卖,淘宝用mysql统计好评差评

    有三张表商家表,订单表,评价表 一个商家多个订单,一个订单对应一个评价,订单表有商家id,评价表有商家id还有订单id sql=" SELECT s.*,(SELECT count(e.id ...

  5. 为何总给外卖打差评?我们来数据分析一下!

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 燕雀安知鸿鹄之志哉? 本次项目使用 ...

  6. 【NLP】用ML实现中文短文本分类(二分类)

    1.用ML实现外卖评论的分类 步骤 语料加载. 分词. 去停用词. 抽取词向量特征. 分别进行算法建模和模型训练. 评估.计算AUC值. 模型对比 1.进行语料加载. 在此之前,引入python依赖的 ...

  7. NLP之NBGBT:基于朴素贝叶斯(count/tfidf+网格搜索+4fCrva)、梯度提升树(w2c+网格搜索+4fCrva)算法对IMDB影评数据集进行文本情感分析(情感二分类预测)

    NLP之NB&GBT:基于朴素贝叶斯(count/tfidf+网格搜索+4fCrva).梯度提升树(w2c+网格搜索+4fCrva)算法对IMDB影评数据集进行文本情感分析(情感二分类预测) ...

  8. 电影评论分类(python深度学习——二分类问题)

    记:二分类问题应该是应用最广泛的机器学习问题,电影评论分类是指根据电影评论的文字内容,将其划分为正面评论或者是负面评论,是一个二分类问题,我从头到尾学习了代码,并且进行了整理,有的内容是个人理解,如有 ...

  9. 电影评论分类:二分类问题 —— R语言实现

    前言 在R和Python之间如何进行选择一直是一个热议的话题.机器学习世界也被不同语言偏好所划分.但是随着深度学习的盛行,天平逐渐向Python倾斜,因为截至目前为止Python具有大量R所没有的深度 ...

最新文章

  1. 【救援过程】升级openssl导致libcrypto.so.1.1动态库不可用
  2. Labview通过RS422通讯接口PC与下位机通信
  3. kubesphere 3.0离线安装
  4. android如何实现QQ信息通知,android NotificationListenerService监听通知栏(qq 微信 短信)...
  5. 19.浏览器Window服务($window)
  6. XJOI 3877 红蓝字符串
  7. 如何通过SCJP考试(含真题分析和考点)
  8. Achain迎来众多合作伙伴 共建社区生态发展
  9. redis 系列——5、跳跃表
  10. python实现multi函数参数个数不限、返回所有参数乘积_实现multi()函数,参数个数不限,返回所有参数的乘积。_学小易找答案...
  11. 九度OJ题目1035:找出直系亲属
  12. vus3+Ts Apache ECharts 的使用(可视化图表库)
  13. 智慧医院3D导航导诊系统-基础功能详解
  14. python发邮件,添加附件
  15. HorizontalScrollView 滑动处理
  16. 一个让人看了心酸、落泪的故事
  17. 哈工大操作系统课程实验记录
  18. VMware12版虚拟机怎么安装win7系统(详细教程)
  19. tp-link设置为中继模式
  20. vue 头像上传裁剪功能

热门文章

  1. 打开计算机任务栏有桌面没,开机后桌面没有图标任务栏无显示怎么解决
  2. HTML(一、语法规范,二、结构标签,三、开发工具,四、HTML常用标签,五、注释和特殊字符)
  3. 数组的趣味应用-鲁智深吃馒头
  4. linux下远程桌面remmina安装,Linux-远程桌面连接工具remmina
  5. 交换机模拟配置软件_GNS3 for mac(网络模拟工具)
  6. java祖玛7723,Unity - 祖玛游戏
  7. 关于学习的网站和常用的工具网站的积累——来自贫民窟的孩子(持续更新)
  8. 行人重识别(21)——行人重识别算法性能指标
  9. hdu5514Frogs
  10. 数据库导入导出方法以及注意事项