NLP 您所在的位置:网站首页 二分类的应用场景 NLP

NLP

2024-03-14 09:15| 来源: 网络整理| 查看: 265

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

一、概念

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

二分类是指将一组文本分成两个类(0或1),比较常见的应用如垃圾邮件分类、电商网站的用户评价数据的正负面分类等,多分类是指将文本分成若干个类中的某一个类,比如说门户网站新闻可以归属到不同的栏目中(如政治、体育、社会、科技、金融等栏目)去。多标签分类指的是可以将文本分成若干个类中的多个类,比如一篇文章里即描写政治又描写金融等内容,那么这篇文章可能会别贴上政治和金融两个标签。 二、二分类实战-划分好评/差评 1.处理步骤 将原始语料切词并过滤停用词词向量初始化构建模型并训练测试 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 如下: 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 defaultdict import 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


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有