码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【2023】数据挖掘课程设计:基于TF-IDF的文本分类


    目录

    一、课程设计题目

            基于TF-IDF的文本分类

    二、课程设计设置

    1. 操作系统

    2. IDE

    3. python

    4. 相关的库

    三、课程设计目标

    1. 掌握数据预处理的方法,对训练集数据进行预处理;

    2. 掌握文本分类建模的方法,对语料库的文档进行建模; 

    3. 掌握分类算法的原理,基于有监督的机器学习方法,训练文本分类器。

    四、课程设计内容

    1. 数据采集和预处理

    a. 数据采集

    b. 数据清洗

    c. 文本预处理:分词、去除停用词、移除低频词

    2. 特征提取和文本向量模型构建

    a. 词袋模型

    b. TF-IDF(本次实验中选取该方法)

    c. Word2Vec

    3. 分类模型训练

    a. 数据划分

    b. 模型训练

    c. 模型调参:网格搜索

    d. 模型评估:计算准确率、精确率、召回率、F1值、混淆矩阵

    五、实验结果分析


    一、课程设计题目

            基于TF-IDF的文本分类

    二、课程设计设置

    1. 操作系统

            Windows 11 Home

    2. IDE

            PyCharm 2022.3.1 (Professional Edition)

    3. python

            3.6.0

    4. 相关的库

    jieba

    0.42.1

    numpy

    1.13.1

    pandas

    0.24.0

    requests

    2.28.1

    scikit-learn

    0.19.0

    tqdm

    4.65.0

    conda create -n DataMining python==3.6 pandas scikit-learn tqdm requests jieba

    三、课程设计目标

    1. 掌握数据预处理的方法,对训练集数据进行预处理;

    2. 掌握文本分类建模的方法,对语料库的文档进行建模; 

    3. 掌握分类算法的原理,基于有监督的机器学习方法,训练文本分类器。

    四、课程设计内容

    1. 数据采集和预处理

    a. 数据采集

            ①数据来源:

    GitHub - SophonPlus/ChineseNlpCorpus: 搜集、整理、发布 中文 自然语言处理 语料/数据集,与 有志之士 共同 促进 中文 自然语言处理 的 发展。搜集、整理、发布 中文 自然语言处理 语料/数据集,与 有志之士 共同 促进 中文 自然语言处理 的 发展。 - GitHub - SophonPlus/ChineseNlpCorpus: 搜集、整理、发布 中文 自然语言处理 语料/数据集,与 有志之士 共同 促进 中文 自然语言处理 的 发展。icon-default.png?t=N7T8https://github.com/SophonPlus/ChineseNlpCorpus

            ②数据选择:

            waimai_10k .csv为某外卖平台收集的用户评价,正向 4000 条,负向 约 8000 条,其中:

    字段

    说明

    label

    1 表示正向评论,0 表示负向评论

    review

    评论内容

    b. 数据清洗

            数据清洗是指去除数据中不需要的内容,例如空格、数字、特殊符号等。

    1. data = data.fillna('') # 用空字符串填充缺失值
    2. data = data.apply(lambda x: x.strip()) # 去除文本开头和结尾的空白字符
    3. data = data.apply(lambda x: x.replace('\n', ' ')) # 将换行符替换为空格
    4. data = data.apply(lambda x: re.sub('[0-9]', '', x)) # 去除数字
    5. data = data.apply(lambda x: re.sub("[^a-zA-Z\u4e00-\u9fff]", ' ', x)) # 去除非汉字和字母的非空白字符

    c. 文本预处理:分词、去除停用词、移除低频词

    ①文本分词

            研究表明中文文本特征粒度为词粒度远远好于字粒度,目前常用的中文分词算法可分为三大类:基于词典的分词方法、基于理解的分词方法和基于统计的分词方法。

    ②去停用词

            停用词(Stop Word)是一类 既普遍存在又不具有明显的意义的词,在中文中例如:"吧"、 "是"、 "的"、 "了"、"并且"、"因此"等。这些词的用处太普遍,去除这些词,对于文本分类来说没有什么不利影响,相反可能改善机器学习效果。

    ③移除低频词

            低频词就是在数据中出现次数较少的词语。此类数据实际上是具有一定的信息量,但是把低频词放入模型当中运行时,它们常常保持他们的随机初始状态,给模型增加了噪声。

    1. # 文本预处理
    2. data = data.apply(lambda x: ' '.join(jieba.cut(x))) # 使用jieba分词
    3. # 停用词列表
    4. stopwords = ["吧", "是", "的", "了", "啦", "得", "么", "在", "并且", "因此", "因为", "所以", "虽然", "但是"]
    5. data = data.apply(lambda x: ' '.join([i for i in x.split() if i not in stopwords])) # 去停用词
    6. # 移除低频词
    7. word_counts = Counter(' '.join(data).split())
    8. low_freq_words = [word for word, count in word_counts.items() if count < 3]
    9. data = data.apply(lambda x: ' '.join([word for word in x.split() if word not in low_freq_words]))

     ④实验结果

    2. 特征提取和文本向量模型构建

            文本分类任务非常重要的一步就是特征提取,在文本数据集上一般含有数万甚至数十万个不同的词组,如此庞大的词组构成的向量规模惊人,计算机运算非常困难。特征提取就是要想办法选出那些最能表征文本含义的词组元素 ,不仅可以降低问题的规模,还有助于分类性能的改善。

            特征选择的基本思路是根据某个 评价指标独立地对原始特征项(词项)进行评分排序,从中选择得分最高的一些特征项,过滤掉其余的特征项。常用的评价有文档频率、互信息、信息增益、卡方统计量等。        

    a. 词袋模型

            词袋模型是最原始的一类特征集,忽略掉了文本的语法和语序,用一组无序的单词序列来表达一段文字或者一个文档。就是把整个文档集的所有出现的词都丢进“袋子”里面,然后无序去重地排出来(去掉重复的)。对每一个文档,按照词语出现的次数来表示文档 。

    b. TF-IDF(本次实验中选取该方法)

            TF-IDF模型主要是用词汇的统计特征作为特征集,TF-IDF 由两部分组成:TF(Term frequency,词频),IDF(Inverse document frequency,逆文档频率)两部分组成,利用 TF 和 IDF 两个参数来表示词语在文本中的重要程度。

             TF-IDF 方法的主要思路是一个词在当前类别的重要度与在当前类别内的词频成正比,与所有类别出现的次数成反比。可见 TF 和 IDF 一个关注文档内部的重要性,一个关注文档外部的重要性,最后结合两者,把 TF 和 IDF 两个值相乘就可以得到 TF-IDF 的值,即

    c. Word2Vec

            Word2Vec是一种基于词向量的特征提取模型,该模型基于大量的文本语料库,通过类似神经网络模型训练,将每个词语映射成一个 定 维度的向量,维度在几十维到几百维之间,每个向量就代表着这个词语,词语的语义和语法相似性和通过向量之间的相似度来判断。

    3. 分类模型训练

    a. 数据划分

    X_train, X_test, y_train, y_test = train_test_split(X, Data_raw['label'],shuffle=True, test_size=0.3, random_state=j)

    b. 模型训练

    1. model = KNeighborsClassifier()
    2. # model = svm.SVC()
    3. # model = MLPClassifier(hidden_layer_sizes=(100,), max_iter=500)
    4. # 训练模型
    5. model.fit(tfidf_train, y_train)
    6. # 测试模型
    7. y_pred = model.predict(test_selected)

    c. 模型调参:网格搜索

            网格搜索就是先定义一个超参数的取值范围,然后对这些超参数的所有可能组合进行穷举搜索。以svm为例

    1. def svm_grid(X_train, y_train):
    2. param_grid = [{
    3. # 'C':
    4. 'kernel': ['linear', # 线性核函数
    5. 'poly', # 多项式核函数
    6. 'rbf', # 高斯核
    7. 'sigmoid' # sigmod核函数
    8. # 'precomputed' # 核矩阵
    9. ], # 核函数类型,
    10. 'degree': np.arange(2, 5, 1), # int, 多项式核函数的阶数, 这个参数只对多项式核函数有用,默认为3
    11. # 'gamma': np.arange(1e-6, 1e-4, 1e-5) # float, 核函数系数,只对’rbf’ ,’poly’ ,’sigmod’有效, 默认为样本特征数的倒数,即1/n_features。
    12. # 'coef0' # float,核函数中的独立项, 只有对’poly’ 和,’sigmod’核函数有用, 是指其中的参数c。默认为0.0
    13. }]
    14. svc = svm.SVC(kernel='poly')
    15. # 网格搜索
    16. grid_search = GridSearchCV(svc,
    17. param_grid,
    18. cv=10,
    19. scoring="accuracy",
    20. return_train_score=True)
    21. grid_search.fit(X_train, y_train)
    22. # 最优模型参
    23. final_model = grid_search.best_estimator_
    24. return final_model

    d. 模型评估:计算准确率、精确率、召回率、F1值、混淆矩阵

    1. accuracy = metrics.accuracy_score(y_test, y_pred)
    2. precision = metrics.precision_score(y_test, y_pred)
    3. recall = metrics.recall_score(y_test, y_pred)
    4. f1 = metrics.f1_score(y_test, y_pred)
    5. confusion = metrics.confusion_matrix(y_test, y_pred)
    6. metric.append([accuracy, precision, recall, f1])

    • 多次训练求出平均值:

    五、实验结果分析

            请下载本实验对应的代码及实验报告资源(其中实验分析部分共2页、787字)

            包括完整实验过程分析(文本预处理、建模、分类器训练、手写TF-IDF参数分析等),以及分类器性能评估等。

  • 相关阅读:
    C++并发线程之 互斥量、lock_guard类模板、死锁
    嵌入式学习笔记(42)SD卡的编程接口
    [leecode每日一题]面试题 01.09. 字符串轮转
    聊聊logback的EvaluatorFilter
    【Leetcode】208.实现Trie(前缀树)
    Python之Pands数据分析,从0到掌握
    使用 Docker 自建一款怀旧游戏之 - 扫雷
    JS逆向案例:破解登录密码
    智能算法和人工智能算法,人工智能算法概念股票
    数据挖掘(6)聚类分析
  • 原文地址:https://blog.csdn.net/m0_63834988/article/details/132866309
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号