中文信息处理实验8——基于逻辑斯蒂回归模型的文本分类

2023-11-19

目录

实验目的:

实验要求:

实验内容及原理:

参考代码:

实验结果:


实验目的:

        加深对汉语文本信息处理基础理论及方法的认识和了解,锻炼和提高分析问题、解决问题的能力。通过对具体项目的任务分析、数据准备、算法设计和编码实现以及测试评价几个环节的练习,基本掌握实现一个自然语言处理系统的基本过程。

实验要求:

1.构建基于逻辑斯蒂回归模型分类模型

2.对实验六中的VSM表示文本进行分类

3.对实验七中基于Word2Vec表示的文本进行分类

4.任意输入一句话,能够对其进行基于Word2Vec的向量表示,并进行分类输出其类别标签。

实验内容及原理:

实验8.1:构建基于逻辑斯蒂回归模型分类模型

实验8.2:对实验六中的VSM表示文本进行分类

实验8.3:对实验七中基于Word2Vec表示的文本进行分类、

实验8.4:任意输入一句话,能够对其进行基于Word2Vec的向量表示,并进行分类输出其类别标签。
        对数据集进行划分,对同一批数据进行不同的文本表示方法,输出分类准确率、召回率和F1值,比较两类表示方法的效果差异。
该子任务使用sklearn工具包中的
        LogisticRegression模型,要求熟练掌握工具包安装、数据读取、模型训练、结果保存等相关内容。
参考文档: https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html#sklearn.linear_model.LogisticRegression

主要流程:

1)将实验数据集重新随机打乱顺序,分别获得实验六和实验七中的句子表示。
2)调用sklearn.model_selection库的train_test_split方法划分训练集和测试集,要求训练集:测试集=4: 1。
3)调用sklearn.linear_model库的LogisticRegression方法实例化模型对象。
4)调用sklearn.linear_model库的fit方法进行训练、score方法获取在测试集上的分类正确率。
5)使用pickle保存模型文件。
6)调用sklearn. linear_model库的predict方法输出所有测试集的预测标签,并给出其准确率、召回率和F1指标。
7)任意输入一句新的文本,完成分词-文本表示-类别预测全过程。

实验数据说明:
        实验数据采用htl_del_4000宾馆情感分析数据进行处理,所有数据已按照情感极性划分为褒(pos)贬(neg)两类,各2000篇,每个文本文件为一篇文章,实验数据需要先进行分词,分词方法不限。

参考代码:

四合一

#实验8全部整合
import csv
import numpy as np
import pandas as pd
import jieba.analyse as ana
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
import pickle
import jieba
path='./中文信息处理技术实验数据/htl_del_4000'
np.set_printoptions(threshold=np.inf)#矩阵完全显示
#输出评价指标
def pingjia6(d,lmodel,x_test):
    with open('pred.txt','w+',encoding='utf-8')as f:
        f.write("基于VSM文本表示的测试集预测标签:\n")
        f.write(str(lmodel.predict(x_test))+'\n')
        f.write("基于VSM文本表示的评估指数:"+'\n')
        d1 = dict()
        for k in range(3):
            d.popitem()  # 去除后三个指标
        for i in d.items():
            d1.update(i[1])
            d1.popitem()  # 去除support
            d1["准确率"] = d1.pop("precision")
            d1["召回率"] = d1.pop("recall")
            d1["F1值"] = d1.pop("f1-score")
            f.write(i[0]+' '+str(d1)+'\n')
def pingjia7(d,lmodel,x_test):
    with open('pred.txt','a+',encoding='utf-8')as f:
        f.write("基于Word2Vec文本表示的测试集预测标签:\n")
        f.write(str(lmodel.predict(x_test)) + '\n')
        f.write("基于Word2Vec文本表示的评估指数:" + '\n')
        d1 = dict()
        for k in range(3):
            d.popitem()  # 去除后三个指标
        for i in d.items():
            d1.update(i[1])
            d1.popitem()  # 去除support
            d1["准确率"] = d1.pop("precision")
            d1["召回率"] = d1.pop("recall")
            d1["F1值"] = d1.pop("f1-score")
            f.write(i[0]+' '+str(d1)+"\n")
def fun():
    print("训练成功")
def fun1():
    i=0
    if i==0:
        pass
#将数据按照文档id提取内容,并返回字符串
def Sread(file):
    with open(file,'r',encoding='gbk',errors='ignore') as f:
        f.seek(0)
        s=f.read().replace('\n','')
        return s
def ToCSV6(file1,file2):
    with open(file1, 'w', newline='', encoding='utf-8') as cf:
        writer = csv.writer(cf)
        writer.writerow(["id", "label"])
        with open(file2, 'r', encoding='utf-8') as f:
            l = f.readlines()
            i = 0
            for s in l:
                l0 = []#存储要写入csv文件的数据
                l1 = s.split('\t')  # l1[0]为文档id
                if i < 2000:  # l[0]到l[1999]为neg
                    p = path + '/neg/' + 'neg.' + l1[0] + '.txt'
                    l0.append(Sread(p))
                    l0.append('neg')
                    i += 1
                    writer.writerow([l0[0], l0[1]])
                else:
                    p = path + '/pos/' + 'pos.' + l1[0] + '.txt'
                    l0.append(Sread(p))
                    l0.append('pos')
                    i += 1
                    writer.writerow([l0[0], l0[1]])
def Tocsv7(file1,file2):
    with open(file1, 'w', newline='', encoding='utf-8') as cf:
        writer = csv.writer(cf)
        writer.writerow(["id", "label"])
        with open(file2, 'r', encoding='utf-8') as f:
            l = f.readlines()
            for s in l:
                l0 = []#存储要写入csv文件的数据
                l1 = s.split(' ')
                l2 = l1[0].split('-')
                if l1[1] == '0':#neg
                    p = path + '/neg/' + 'neg.' + l2[0] + '.txt'
                    with open(p, 'r', encoding='gbk', errors='ignore') as f1:
                        f1.seek(0)
                        s = f1.read().replace('.', '。').replace(';', '。').replace('\n', '')  # 将. ;转换为。便于分割
                        l3 = s.split('。')
                        for j in l3:
                            if j != '':
                                l0.append(j)
                                l0.append('neg')
                                writer.writerow([l0[0], l0[1]])
                                l0 = []#重置l0
                else:#pos
                    p = path + '/pos/' + 'pos.' + l2[0] + '.txt'
                    with open(p, 'r', errors='ignore') as f1:
                        f1.seek(0)
                        s = f1.read().replace('.', '。').replace(';', '。').replace('\n', '')  # 将. ;转换为。便于分割
                        l3 = s.split('。')
                        for j in l3:
                            if j != '':
                                l0.append(j)
                                l0.append('pos')
                                writer.writerow([l0[0], l0[1]])
                                l0 = []
def pr():
    print('*****************我是分割线**********************')

def flat(l):  # 用于将list in list 转为list
    for k in l:
        if not isinstance(k, (list, tuple)):
            yield k
        else:
            yield from flat(k)
def TrSave6(file1,file2):
    #任务1
    raw = pd.read_csv(file1, encoding='utf-8')
    text = raw["id"].values.tolist()
    ana.set_stop_words('cn_stopwords.txt')  # 输入停用词
    text_list = []
    text_list3 = []
    for w in text:
        word_list = ana.extract_tags(str(w), topK=10000, withWeight=False)  # 去除停用词+词频分析
        text_list.append(word_list)
    for m1 in text_list:
        text_list2 = [" ".join(m1)]  # 切好的词用空格连接
        text_list3.append(text_list2)
    text_list4 = list(flat(text_list3))
    # TF-IDF
    vectorizer = TfidfVectorizer()
    wordmtx = vectorizer.fit_transform(text_list4)  # fit_transform()的作用就是先拟合数据,然后转化它将其转化为标准形式
    # 第一步第二步 分为训练集和测试集 shuffle=True打乱数据集 test_size=0.2测试集占比0.2
    x_train, x_test, y_train, y_test = train_test_split(wordmtx, raw["label"],shuffle=True, test_size=0.2, random_state=11)
    # 第三步 实例化模型对象
    lmodel = LogisticRegression(max_iter=1000)#max_iter=1000设置最大迭代次数,防止保存模型时报错
    # 第四步 训练模型
    lmodel=lmodel.fit(x_train, y_train)#训练模型
    fun()
    sc=lmodel.score(x_test, y_test)#获取测试集上的分类正确率
    print("基于"+file1.replace('.csv','')+"文本表示测试集上的分类正确率为",sc)
    # 第五步 使用pickle保存模型
    with open(file2, 'wb') as f:
        pickle.dump(lmodel, f)
    print("模型已成功保存至" + file2)
    #导入模型 #任务2
    with open(file2,'rb')as f:
        lmodel=pickle.load(f)
    print("模型导入成功!")
    # 第六步 输出测试集标签以及评价指标
    d=classification_report(y_test, lmodel.predict(x_test),output_dict=True)
    pingjia6(d,lmodel,x_test)
    # # 第七步 输入文本测试
    # s = input("输入文本:")
    # words = " ".join(jieba.lcut(s))
    # words_vecs = vectorizer.transform([words])
    # print(file1.replace('.csv','')+"预测为:"+lmodel.predict(words_vecs)[0])
def TrSave7(file1,file2):
    #任务1
    raw = pd.read_csv(file1, encoding='utf-8')
    text = raw["id"].values.tolist()
    ana.set_stop_words('cn_stopwords.txt')  # 输入停用词
    text_list = []
    text_list3 = []
    for w in text:
        word_list = ana.extract_tags(str(w), topK=10000, withWeight=False)  # 去除停用词+词频分析
        text_list.append(word_list)
    for m1 in text_list:
        text_list2 = [" ".join(m1)]  # 切好的词用空格连接
        text_list3.append(text_list2)
    text_list4 = list(flat(text_list3))
    # TF-IDF
    vectorizer = TfidfVectorizer()
    wordmtx = vectorizer.fit_transform(text_list4)  # fit_transform()的作用就是先拟合数据,然后转化它将其转化为标准形式
    # 第一步第二步 分为训练集和测试集 shuffle=True打乱数据集 test_size=0.2测试集占比0.2
    x_train, x_test, y_train, y_test = train_test_split(wordmtx, raw["label"],shuffle=True, test_size=0.2, random_state=11)
    # 第三步 实例化模型对象
    lmodel = LogisticRegression(max_iter=1000)#max_iter=1000设置最大迭代次数,防止保存模型时报错
    # 第四步 训练模型
    lmodel=lmodel.fit(x_train, y_train)#训练模型
    fun()
    sc=lmodel.score(x_test, y_test)#获取测试集上的分类正确率
    print("基于" + file1.replace('.csv', '') + "文本表示测试集上的分类正确率为", sc)
    # 第五步 使用pickle保存模型
    with open(file2, 'wb') as f:
        pickle.dump(lmodel, f)
    print("模型已成功保存至" + file2)
    #导入模型 #任务3
    with open(file2,'rb')as f:
        lmodel=pickle.load(f)
    print("模型导入成功!")
    # 第六步 输出测试集标签以及评价指标
    d=classification_report(y_test, lmodel.predict(x_test),output_dict=True)
    pingjia7(d,lmodel,x_test)
    print("任务1 2 3完成!")
    # 第七步 输入文本测试
    #任务4
    pr()
    s = input("输入文本:")
    words = " ".join(jieba.lcut(s))
    words_vecs = vectorizer.transform([words])
    print("基于"+file1.replace('.csv','')+"表示文本预测为:"+lmodel.predict(words_vecs)[0])
    print("任务4完成!")
if __name__ == '__main__':
    ToCSV6('VSM.CSV', '6-1.txt')
    Tocsv7('Word2Vec.csv', '表示.txt')
    TrSave6('VSM.csv','model6.pickle')
    pr()
    TrSave7('Word2Vec.csv','model7.pickle')

实验结果:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

中文信息处理实验8——基于逻辑斯蒂回归模型的文本分类 的相关文章

随机推荐

  • QT添加qss文件和资源文件

    先右键项目 选择 Add New 选择一个模板 选择 Qt 模板 再选择 Qt Resource Files 点击 Choose 填上资源文件的名称 默认添加项目路径下 后面的步骤默认即可 点击完成 新建完成了资源文件后 默认会进入 res
  • 运放稳定性连载21:电容性负载的稳定性——具有双通道反馈的RISO(2)

    现在 我们必须测量如图10 6所示的Zo 小信号AC开环输出阻抗 该Tina SPICE测试电路将测试空载OPA177的Zo R2和R1以及LT为低通滤波器函数提供了一条AC通道 这样 使得我们能将DC短路和AC开路一起并入反馈电路 DC工
  • ssh报错no key alg(关于低版本连接高版本ssh)

    高版本 8 4 低版本 4 3 按照网上的方法试过 通过ssh keygen命令重新生成ssh主机秘钥 可以不用重启sshd服务 ssh keygen t rsa f etc ssh ssh host rsa key ssh keygen
  • NoReverseMatch: Reverse for ‘data‘ not found . ‘data‘ is not a valid view function or pattern

    Django gt python manage py runserver时报错 NoReverseMatch Reverse for data not found data is not a valid view func tion or
  • 制作一辆“自动驾驶”平衡自行车需要用到哪些知识

    目录 先看下小车效果 小车电路设计 相关软件工具 keil C语言设计编码调试工具 主要 mcuisp 代码烧录工具 一般使用一种烧录工具就可以 STM32 STlink stlink烧录工具 STM32 Cube pro 烧录工具 ope
  • C++中的虚函数(表)实现机制以及用C语言对其进行的模拟实现

    本文是转载的 正版是https blog twofei com 496 欢迎去看正版 C 中的虚函数 表 实现机制以及用C语言对其进行的模拟实现 前言 大家都应该知道C 的精髓是虚函数吧 虚函数带来的好处就是 可以定义一个基类的指针 其指向
  • OceanBase使用范例

    http www mysqlops com 2011 08 31 oceanbase use html OceanBase的使用类似于关系型数据库 需要预先创建schema 关于schema的格式 请参见schema说明 假如我们有以下sc
  • c#Socket 异步通讯(客户端与服务端)

    c Socket 异步通讯 多个客户端与服务端 最近公司有个项目 涉及到的通讯对象有点多 就拿其中一个库的通讯来说就用到了3个PLC 这里就涉及了一个服务器与多个客户端之间的通讯了 同时上位机既需要做客户端 也需要做服务端 因为跟PLC之间
  • HTTP响应详解, HTTP请求构造及HTTPS详解

    HTTP响应详解 认识 状态码 status code 状态码表示访问一个页面的结果 是访问成功 还是失败 还是其他的一些情况 以下为常见的状态码 200 OK 这 是一个最常见的状态码 表示访问成功 抓包抓到的大部分结果都是 200 例如
  • numpy load npz文件

    一 问题 numpy version 1 23 0 优化项目的是时候发现索引一个dict的时候很慢 因此进行分析 速度很慢的问题代码如下 arr dict np load test npz npz 100MB for i in range
  • 神州网信远程、关闭屏幕时间、关闭神州网信密码

    一 远程查看电脑 按 windows r 输入gpedit msc 运行组策略 gpedit msc 进行下面的操作 1 计算机配置 管理模板 Windows组件 远程桌面服务 远程桌面会话主机 连接 允许用户通过使用远程桌面服务进行远程连
  • Qt creator4.8.0 以上使用SqLite数据库进行数据操作

    文章目录 前言 一 在 pro工程文件中添加sql模块 二 使用步骤 1 添加头文件 2 链接并打开数据库 3 创建用户信息表management info 4 插入数据操作 5 修改数据库操作 6 查询数据库 总结 前言 Qt creat
  • 基于MATLAB的filter的使用,低通、带通和高通滤波器设计

    1 目的 学习MATLAB的filter函数的使用 通过设计低通 带通和高通滤波器对其进行仿真 2 用到的主要函数和工具 MATLAB FDATOOL filter fft 3 设计 信号的产生 Parameter Interface Fr
  • java高级开发面试题总结

    面试题总结 JAVA高级工程师 近期考虑换工作的问题 于是投简历面试 面试5家公司的高级Java工程师 有4家给了我offer 想着总结一下面试经验 方便最近正在寻求机会的你们 一 无笔试题 不知道是不是职位原因还是没遇到 面试时 都不需要
  • 阿里云轻量应用服务器使用指南适用于所有人

    最近一直在捣鼓阿里云服务器 想着把自己写好的一些项目部署到服务器上供其他人访问 一路上踩了不少坑 也查了不少资料 最后解决了 写个博客记录下来 也为其他想要建站的同学提供一个指引 购买轻量应用服务器 传送门 阿里云 如果是在校学生 可以直接
  • SpringCloud之Hystrix

    1 服务熔断与降级 在微服务架构中多层服务之间会相互调用 如果其中有一层服务故障了 可能会导致一层服务或者多层服务 故障 从而导致整个系统故障 这种现象被称为服务雪崩效应 SpringCloud 中的 Hystrix 组件就可以解决此类问题
  • 有时间再看decode详解

    Oracle 中 decode 函数用法 含义解释 decode 条件 值1 返回值1 值2 返回值2 值n 返回值n 缺省值 该函数的含义如下 IF 条件 值1 THEN RETURN 翻译值1 ELSIF 条件 值2 THEN RETU
  • 冲刺春招-精选笔面试 66 题大通关 day6

    day6题目 33 搜索旋转排序数组 54 螺旋矩阵 bytedance 006 夏季特惠 学习计划链接 冲刺春招 精选笔面试 66 题大通关 今日知识点 二分 模拟 01背包 难度为中等 中等 字节 简单 33 搜索旋转排序数组 整数数组
  • ARouter(二)源码解析

    前言 这一篇我们来具体看一下ARouter的实现原理 如果你之前没有接触过ARouter 可以先阅读上一篇 Android 从零开始打造自己的深度链接库 一 ARouter简介 废话不多 我们赶紧分析源码 正文 首先我们从github下载最
  • 中文信息处理实验8——基于逻辑斯蒂回归模型的文本分类

    目录 实验目的 实验要求 实验内容及原理 参考代码 实验结果 实验目的 加深对汉语文本信息处理基础理论及方法的认识和了解 锻炼和提高分析问题 解决问题的能力 通过对具体项目的任务分析 数据准备 算法设计和编码实现以及测试评价几个环节的练习