Python 自然语言处理 文本分类 地铁方面留言文本

news2025/7/16 9:50:35

将关于地铁的留言文本进行自动分类。

不要着急,一步步来。

导入需要的库。

import numpy as np
import pandas as pd
import jieba # 分词
import re # 正则
from fnmatch import fnmatch # 通配符
from sklearn.preprocessing import LabelEncoder
from sklearn.feature_extraction.text import CountVectorizer # 文本向量化
from sklearn.feature_extraction.text import TfidfTransformer # 文本向量化
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, confusion_matrix
from sklearn import svm # 支持向量机模型

定义函数,加载用来分词的自定义词典。

# 可根据实际需要,手动调整自定义词典路径和自定义词汇
def jieba_fenci():
    # 在jieba中加载自定义的地铁线路名、地铁站点名词典
    jieba.load_userdict("mydict_line.csv")
    jieba.load_userdict("mydict_station.csv")
    # 一些在市民留言中常见的高频的词,发现了就手动添加进去
    myaddword_ls = ["公共自行车", "金溪园"]
    for w in myaddword_ls:
        jieba.add_word(w)

定义函数,生成自己的停用词词典,得到一个文件。

我找的4个停用词词典下载地址:https://gitcode.net/mirrors/goto456/stopwords/-/tree/master

后面我会把自己整合好的停用词词典上传。

# 这段代码只用跑一次,以后可以直接用这个文件
# 自己给停用词文件起好名字(路径),作为投入函数的参数
def get_mystopwords_file(mystopwords_file_name):
    stopwords_path_ls = ["baidu_stopwords.txt", "cn_stopwords.txt", "hit_stopwords.txt", "scu_stopwords.txt"]
    stopwords_set = set() # 集合可以自动去重
    for p in stopwords_path_ls:
        with open(p, 'r', encoding = 'utf-8') as stopwords_file:
            for stopword in stopwords_file:
                if u'\u4e00'<= stopword[0] <= u'\u9fff':  # 只放中文的停用词
                    stopwords_set.add(stopword.strip('\n'))
    with open(mystopwords_file_name, 'w') as mystopwords_file:
        for stopword in stopwords_set:
            mystopwords_file.write(stopword + '\n')

定义函数,读取停用词词典文件,得到一个停用词列表。

# 可以根据实际需要,手动添加或删除停用词
def get_mystopwords_list(mystopwords_file_name):
    mystopwords_ls = []
    with open(mystopwords_file_name, 'r') as mystopwords_file:
        for stopword in mystopwords_file:
            mystopwords_ls.append(stopword.strip('\n'))
    # 对于一些高频出现的、但对于分类没什么特征帮助的词,可以手动加进停用词列表
    zdy_stopword = ["建议", "信访", "杭州"]
    for w in zdy_stopword:
        mystopwords_ls.append(w)
    # 对于一些停用词表里有的、但认为对后面分析有用的词,可以手动从停用词列表剔除
    zdy_not_stopword = [] # 目前还没想好剔除什么词,所以列表是空的
    for w in zdy_not_stopword:
        mystopwords_ls.remove(w)
    return mystopwords_ls

定义函数,统一地铁线路名称格式。

# 投入参数是一个已经分好词的列表,返回一个处理好的列表
def unify_line_name(mylist):
    num_dict = {1:'一', 2:'二', 3:'三', 4:'四', 5:'五', 6:'六', 7:'七', 8:'八', 9:'九', \
               10:'十', 11:'十一', 12:'十二', 13:'十三', 14:'十四', 15:'十五', 16:'十六', 17:'十七', \
               18:'十八', 19:'十九', 20:'二十', 21:'二十一', 22:'二十二', 23:'二十三'}
    for i in range(len(mylist)):
        if fnmatch(mylist[i], "*号线") or fnmatch(mylist[i], "*号地铁"):
            for j in range(len(num_dict),0,-1):
                if str(j) in mylist[i] or num_dict[j] in mylist[i]:
                    mylist[i] = "地铁" + str(j) + "号线"
                    break
        if mylist[i] in ["机场快线", "机场轨道快线"]:
            mylist[i] = "地铁19号线"
    return mylist

定义文本预处理的函数,作用:去除无用字符、去除停用词、统一地铁线路名。

# 投入的参数是一个原始字符串,返回一个处理好的字符串(分好的词之间空格连接)
# 要在使用这个函数之前弄好停用词列表,列表名称是mystopwords_ls
def mychuli(x):
    # 仅保留汉字、英文字母、阿拉伯数字
    mystr = ''.join(re.findall('[a-zA-Z0-9\u4e00-\u9fa5]',x))
    # 分词,每个字符串变成一个列表
    mylist = jieba.lcut(mystr, cut_all = False)
    # 统一线路名称
    mylist = unify_line_name(mylist)
    # 去除停用词
    for word in mylist:
        if word in mystopwords_ls:
            mylist.remove(word)
    return ' '.join(mylist)

定义模型实际应用的函数,输入文本,输出分类结果。

# 输入一条文本,经预处理后投进支持向量机模型进行预测
def mypre():
    lebel_dict = dict(zip([0,1,2,3,4,5,6,7,8,9], le.inverse_transform([0,1,2,3,4,5,6,7,8,9])))
    mytext = input("输入要预测的文本:")
    mytext_yichuli = mychuli(mytext)
    print("文本预处理结果:{}".format(mytext_yichuli))
    
    X_new = []
    X_new.append(mytext_yichuli)
    
    X_new_vec = tf.fit_transform(cv_new.fit_transform(X_new)).toarray()
    y_new_pre = SVM.predict(X_new_vec)
    
    print("模型预测的分类编号为:{}".format(y_new_pre[0]))
    print("对应的分类名称为:{}".format(lebel_dict[y_new_pre[0]]))

读取文本,去重。

# 读取语料文件
df = pd.read_csv("xxx.csv")
print("去重前:")
print(df.info())
# 去除重复数据
df1 = df.drop_duplicates()
print("去重后:")
print(df1.info())
print(df1.head())

jieba_fenci() # 加载自定义的分词词典
get_mystopwords_file("mystopwords.txt") # 得到一个整合好的停用词文件,只用跑一次
mystopwords_ls = get_mystopwords_list("mystopwords.txt") # 得到停用词列表

# 新建一列yichuli_title,放已经处理好的文本数据
df1['yichuli_title'] = df1['title'].apply(mychuli)
# 给类别进行编号
le = LabelEncoder()
le.fit(df1['class1'])
df1['yichuli_label'] = le.transform(df1['class1'])

# 把处理好的结果写入一个新的csv文件,方便以后使用
# 用gb18030编码可实现外面打开这个文件看显示正常中文,而不是乱码
df1.to_csv("test0908_result.csv", columns = ['yichuli_title', 'yichuli_label', 'class1'], encoding = "gb18030")

构建训练集、测试集。 

# 读取已经处理好的csv文件
df1 = pd.read_csv("test0908_result.csv", encoding = "gb18030")

# 构建训练集、测试集
cv = CountVectorizer()
tf = TfidfTransformer()
X = df1['yichuli_title']
y = df1['yichuli_label']
X = tf.fit_transform(cv.fit_transform(X)).toarray()
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1)

print(X_train.shape)
print(X_test.shape)

训练模型。

SVM = svm.LinearSVC() #支持向量机分类器LinearSVC
SVM.fit(X_train, y_train)
y_pre = SVM.predict(X_test)
print("支持向量机模型结果:")
print(classification_report(y_test, y_pre))
# 支持向量机的混淆矩阵
svm_confuse = pd.DataFrame(confusion_matrix(y_test, y_pre))
print(svm_confuse)

预测新数据。

cv_new = CountVectorizer(vocabulary = cv.vocabulary_)  # vocabulary参数保证向量维度与训练集一致
mypre()

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

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

相关文章

数据分析面试题(2023.09.08)

数据分析流程 总体分为四层&#xff1a;需求层、数据层、分析层和结论层 一、统计学问题 1、贝叶斯公式复述并解释应用场景 公式&#xff1a;P(A|B) P(B|A)*P(A) / P(B)应用场景&#xff1a;如搜索query纠错&#xff0c;设A为正确的词&#xff0c;B为输入的词&#xff0c;那…

世和基因亮相2023服贸会,中国精准检测技术走向世界

9月6日&#xff0c;2023中国国际服务贸易交易会在北京圆满收官&#xff0c;本届服贸会围绕“开放引领发展&#xff0c;合作共赢未来”年度主题&#xff0c;吸引了全球领先的创新技术和科研成果亮相盛会&#xff0c;累计入场近28万人。 作为国内肿瘤精准医学头部企业&#xff0…

pdfjs在线预览组件的使用

前言 pdfjs在线预览组件。 原生浏览器预览pdf文件&#xff0c;存在pdf xss跨站攻击风险。推荐使用pdfjs第三方组件在线预览pdf文件。 如何使用 下载 官方插件下载地址&#xff1a;https://mozilla.github.io/pdf.js/getting_started/ 安装 把下载的文件复制到项目中 使用pd…

Docker详解,7分钟学会

大家好&#xff0c;欢迎来到停止重构的频道。 本期我们讨论docker。 docker的好处是可以隔离环境&#xff0c;多容器间环境隔离互不影响。 而且得益于优秀的镜像机制&#xff0c;可以用于手工快速部署。 我们按这样的顺序展开讨论&#xff1a; 1、 docker的工作原理 2、 …

jvm 程序计算器 程序计数器是否溢出 程序计数器是做什么的 java程序计数器会内存溢出吗 程序计数器作用与用处 jvm内存模型 jvm合集(一)

1. jvm内存模型&#xff1a; 内存模型&#xff1a; 程序计数器 堆 栈 本地方法栈 方法区 2. java代码编译为class文件&#xff0c;由类加载器加载到jvm&#xff0c;然后由解释器,jit即时编译到机器码&#xff0c;机器码再到cpu执行 3. 程序计数器&#xff1a; 是一块较小的内存…

Excel相关笔记

1、找出B列中A列没有的数据并放在C列 公式&#xff1a;IF(ISNA(VLOOKUP(B1,$A 1 : 1: 1:A$4,1,FALSE)),B1,“”)

索尼 toio™ 应用创意开发征文 | 如何用Python控制Q宝进行机器人擂台赛

你是否曾经想过&#xff0c;如果能用编程来控制真实的物体&#xff0c;那该有多有趣&#xff1f;如果能让一个小方块按照你的指令来移动、旋转、闪烁&#xff0c;那该有多酷&#xff1f;如果能让一个小方块和其他小方块互动&#xff0c;那该有多神奇&#xff1f;这些想法&#…

Jmeter系列-插件安装(5)

前言 jmeter4.0以上&#xff0c;如现在最新的5.2.1版本是有集成插件的只需要在官网下载 plugins-manager.jar 包&#xff0c;放在jmeter安装路径的lib/ext目录下即可使用&#xff1a;https://jmeter-plugins.org/install/Install/但并不能满足所有需求&#xff0c;仍然需要安装…

CSS读书笔记

——————————————精华部分—————————————— 1、选择器 &#xff08;1&#xff09;基本选择器&#xff1a; 标签选择器 body{} 类选择器 class .class名称{} ID选择器 id #id名称{} 优先级&#xff1a;ID选择器 > 类选择器 > 标签选择器 &am…

乐鑫 ESP-Mesh-Lite:轻松覆盖更大范围,连接更多设备

乐鑫科技 (688018.SH) 基于 Wi-Fi 协议推出了 Mesh 组网方案 ESP-Mesh-Lite&#xff0c;支持更多设备在更大范围内轻松联网。这一创新性的 Wi-Fi Mesh 技术通过构建灵活、可靠的物联网组网方案&#xff0c;使用户可以享受到快速、稳定且安全的 Wi-Fi 覆盖&#xff0c;不再受到设…

解耦只是一个巧合?

本文分享一篇在IJCAI2023看到的文章&#xff1a;Overlooked Implications of the Reconstruction Loss for VAE Disentanglement 首先回顾下VAE&#xff0c;其loss函数有两项&#xff0c;一项是重构误差&#xff0c;另一项是正则项&#xff1a; L r e c ( x , x ^ ) E q ϕ (…

GPU编程(基于Python和CUDA)(四)——Mandelbort集

系列文章目录 GPU编程&#xff08;基于Python和CUDA&#xff09;&#xff08;一&#xff09;——零基础安装pycuda GPU编程&#xff08;基于Python和CUDA&#xff09;&#xff08;二&#xff09;——显示GPU信息 GPU编程&#xff08;基于Python和CUDA&#xff09;&#xff08;…

excel功能区(ribbonx)编程笔记--3 editbox与状态按钮togglebutton控件

从上次发布编程笔记2后,反响还不错,短短一个星期,访问量就达到了1500,说明虽然这个只是有写古老,但是再实际的工作中,excel的编程功能还是有或多人关注的,还不是很小众,比如我就是平时的统计就是使用excle,为了更好的实现自动统计,会添加部分vba代码到里面,就像我的…

直播|DITA内容发布工具解析 - 问答总结

9月6日&#xff0c;我们进行了一场名为“DITA内容发布工具解析”的直播。通过直播&#xff0c;大家了解到&#xff1a; DITA-OT简介 默认输出效果 定制以后输出效果 发布过程与样式定制 在问答环节&#xff0c;大家进行了热烈沟通。我将几个大家关心的问题和答复总结如下&…

图像文件的操作MATLAB基础函数使用

简介 MATLAB中的图像处理工具箱体统了一套全方位的标准算法和图形工具&#xff0c;用于进行图像处理、分析、可视化和算法开发。这里仅仅对常用的基础函数做个使用介绍。 查询图像文件的信息 使用如下函数 imfinfo(filename,fmt) 函数imfinfo返回一个结构体的info&#xff…

27.方向标

题目 描述 一位木匠收到了一个木制指示牌的订单。每块木板必须与前一块垂直对齐&#xff0c;要么与前一个箭头的基部对齐&#xff0c;要么与相反的一侧对齐&#xff0c;在那里用特制的螺钉固定。两块木板必须重叠。木匠将设计师发送的草图编码成了一个整数序列&#xff0c;但…

达梦数据库MAIN表空间导致磁盘满问题的处理和总结

前言 在达梦数据库使用中&#xff0c;建议对数据库表空间使用进行规划&#xff0c;业务用户创建单独的表空间使用。 如果不创建单独的用户表空间会遇到什么问题呢&#xff1f;通过下面的问题和测试说明合理的表空间规划是有必要的。 问题 某开发项目组使用DM8 1-2-192 版本。…

Window安装Node.js npm appium Appium Desktop

Window安装Node.js npm appium appium Desktop 1.安装nodejs 参考链接&#xff1a; https://blog.csdn.net/weixin_42064877/article/details/131610918 1)打开浏览器&#xff0c;并前往 Node.js 官网 https://nodejs.org/ ↗。 2)在首页中&#xff0c;您可以看到当前 Node.…

解决防火墙导致虚拟机不能ping通宿主机的问题

今天&#xff0c;无缘无故的&#xff0c;虚拟机突然用不了&#xff0c;网络连上不了&#xff0c;一番折腾翻找&#xff0c;最后才发现&#xff0c;是因为虚拟机ping不同宿主主机了&#xff0c;连网关都ping不通了&#xff0c;但是&#xff0c;宿主主机却可以ping通虚拟机 。 最…