当前位置:   article > 正文

【101】NLP 自然语言处理14种分类算法】

自然语言处理分类方法

  

内容目录

一、数据集介绍二、解压文件明确需求三、批量读取和合并文本数据集四、中文文本分词五、停止词使用六、编码器处理文本标签七、常规算法模型1、k近邻算法2、决策树3、多层感知器4、伯努力贝叶斯5、高斯贝叶斯6、多项式贝叶斯7、逻辑回归8、支持向量机八、集成算法模型1、随机森林算法2、自适应增强算法3、lightgbm算法4、xgboost算法九、深度学习1、前馈神经网络2、LSTM 神经网络十、算法之间性能比较

一、数据集介绍

文档共有4中类型:女性、体育、文学、校园 

训练集放到train文件夹里,测试集放到test文件夹里。

停用词放到stop文件夹里。 

  1. 训练集:3305 [女性,体育,文学,校园]
  2. 测试集 200 [女性,体育,文学,校园]
  1. import os
  2. import shutil
  3. import zipfile
  4. import jieba
  5. import time
  6. import warnings
  7. import xgboost
  8. import lightgbm
  9. import numpy as np
  10. import pandas as pd
  11. from keras import models
  12. from keras import layers
  13. from keras.utils.np_utils import to_categorical
  14. from keras.preprocessing.text import Tokenizer
  15. from sklearn import svm
  16. from sklearn import metrics
  17. from sklearn.neural_network import MLPClassifier
  18. from sklearn.tree import DecisionTreeClassifier
  19. from sklearn.neighbors import KNeighborsClassifier
  20. from sklearn.naive_bayes import BernoulliNB
  21. from sklearn.naive_bayes import GaussianNB
  22. from sklearn.naive_bayes import MultinomialNB
  23. from sklearn.linear_model import LogisticRegression
  24. from sklearn.ensemble import RandomForestClassifier
  25. from sklearn.ensemble import AdaBoostClassifier
  26. from sklearn.preprocessing import LabelEncoder
  27. from sklearn.feature_extraction.text import CountVectorizer
  28. from sklearn.feature_extraction.text import TfidfVectorizer 
  29. warnings.filterwarnings('ignore')

二、解压文件明确需求

《获取数据》—《数据分析和处理》—《特征工程与选择》—《算法模型》—《性能评估/参数调优》

目标需求1:批量读取文档文件.txt
目标需求2:文本向量化使用词袋法或者TFIDF
目标需求3:比较各个算法的性能优劣,包括模型消耗用时、模型准确率

三、批量读取和合并文本数据集

  1. path = 'D:\\A\\AI-master\\py-data\\text_classification-master\\text classification'
  2. def read_text(path, text_list):
  3.     '''
  4.     path: 必选参数,文件夹路径
  5.     text_list: 必选参数,文件夹 path 下的所有 .txt 文件名列表
  6.     return: 返回值
  7.         features 文本(特征)数据,以列表形式返回;
  8.         labels 分类标签,以列表形式返回
  9.     '''
  10.     features, labels = [], []
  11.     for text in text_list:
  12.         if text.split('.')[-1] == 'txt':
  13.             try:
  14.                 with open(path + text, encoding='gbk') as fp:
  15.                     features.append(fp.read())  # 特征
  16.                     labels.append(path.split('\\')[-2])  # 标签
  17.             except Exception as erro:
  18.                 print('\n>>>发现错误, 正在输出错误信息...\n', erro)
  19.     return features, labels
  20. def merge_text(train_or_test, label_name):
  21.     '''
  22.     train_or_test: 必选参数,train 训练数据集 or test 测试数据集
  23.     label_name: 必选参数,分类标签的名字
  24.     return: 返回值
  25.         merge_features 合并好的所有特征数据,以列表形式返回;
  26.         merge_labels   合并好的所有分类标签数据,以列表形式返回
  27.     '''
  28.     print('\n>>>文本读取和合并程序已经启动, 请稍候...')
  29.     merge_features, merge_labels = [], []  # 函数全局变量
  30.     for name in label_name:
  31.         path = 'D:\\A\\AI-master\\py-data\\text_classification-master\\text classification\\' + train_or_test + '\\' + name + '\\'
  32.         text_list = os.listdir(path)
  33.         features, labels = read_text(path=path, text_list=text_list)  # 调用函数
  34.         merge_features += features  # 特征
  35.         merge_labels += labels  # 标签
  36.     # 可以自定义添加一些想要知道的信息
  37.     print('\n>>>你正在处理的数据类型是...\n', train_or_test)
  38.     print('\n>>>[', train_or_test, ']数据具体情况如下...')
  39.     print('样本数量\t'len(merge_features), '\t类别名称\t', set(merge_labels))
  40.     print('\n>>>文本读取和合并工作已经处理完毕...\n')
  41.     return merge_features, merge_labels
  42.  #获取训练集
  43. train_or_test = 'train'
  44. label_name = ['女性''体育''校园''文学']
  45. X_train, y_train = merge_text(train_or_test, label_name)
  46. # 获取测试集
  47. train_or_test = 'test'
  48. label_name = ['女性''体育''校园''文学']
  49. X_test, y_test = merge_text(train_or_test, label_name)
  1. print('X_train, y_train',len(X_train), len(y_train))
  2. print('X_test, y_test',len(X_test), len(y_test))
  1. X_train, y_train 3305 3305
  2. X_test, y_test 200 200

四、中文文本分词

  1. # 训练集
  2. X_train_word = [jieba.cut(words) for words in X_train]
  3. X_train_cut = [' '.join(word) for word in X_train_word]
  4. X_train_cut[:5]
  1. ['明天 三里屯 见 瑞丽 服饰 美容 :2011 瑞丽 造型 大赏 派对 瑞丽 专属 模特 黄美熙 康猴 猴 康乐 帕丽扎 提 也 会 参加 哦 瑞丽 专属 模特 转发 ( 53 ) 评论 ( 5 ) 12 月 8 日 17 : 10 来自 新浪 微博',
  2. '转发 微博 水草 温 :北京 早安 中国 宝迪沃 减肥 训练营 2012 年 寒假 班 开始 报名 早安 中国 吧 : 51 ( 分享 自 百度 贴 吧 ) 您 还 在 为 肥胖 为难 吗 冬季 减肥 训练 帮助 您 快速 减掉 多余 脂肪 咨询 顾问 温 老师 1071108677 原文 转发 原文 评论',
  3. '多谢 支持 , 鱼子 精华 中 含有 太平洋 深海 凝胶 能 给 秀发 源源 滋养 , 鱼子 精华 发膜 含有 羟基 积雪草 苷 , 三重 神经酰胺 能 补充 秀发 流失 的 胶质 , 可以 有 焕然 新生 的 感觉 。鲍艺芳 :我 在 倍 丽莎 美发 沙龙 做 的 奢华 鱼子酱 护理 超级 好用 以后 就 用 它 了 我 的 最 爱 巴黎 卡诗 原文 转发 原文 评论',
  4. '注射 除皱 针 时会 疼 吗 ?其他 产品 注射 会 产生 难以忍受 的 疼痛 , 除皱 针中 含有 微量 的 利多卡因 以 减轻 注射 过程 中 的 疼痛 , 注射 过程 只有 非常 轻微 的 疼痛感 。另外 , 除皱 针 的 胶原蛋白 具有 帮助 凝血 作用 , 极少 产生 淤血 现象 。一般 注射 后 就 可以 出门 。其他 产品 容易 产生 淤斑 , 而且 时间 较长 。让 人 难以 接受 。',
  5. '注射 除皱 针 时会 疼 吗 ?其他 产品 注射 会 产生 难以忍受 的 疼痛 , 除皱 针中 含有 微量 的 利多卡因 以 减轻 注射 过程 中 的 疼痛 , 注射 过程 只有 非常 轻微 的 疼痛感 。另外 , 除皱 针 的 胶原蛋白 具有 帮助 凝血 作用 , 极少 产生 淤血 现象 。一般 注射 后 就 可以 出门 。其他 产品 容易 产生 淤斑 , 而且 时间 较长 。让 人 难以 接受 。']
  1. # 训练集
  2. # 测试集
  3. X_test_word = [jieba.cut(words) for words in X_test]
  4. X_test_cut  = [' '.join(word) for word in X_test_word]
  5. X_test_cut[:5]
  1. ['【 L 丰胸 — — 安全 的 丰胸 手术 】 华美 L 美胸 非常 安全 , 5 大 理由 :① 丰胸 手术 在世界上 已有 超过 100 年 的 历史 ; ② 假体 硅胶 有 40 多年 的 安全 使用 史 ; ③ 每年 都 有 超过 600 万 女性 接受 丰胸 手术 ; ④ 不 损伤 乳腺 组织 , 不 影响 哺乳 ; ⑤ 华美 美莱 率先 发布 中国 首部 《 整形 美容 安全 消费 白皮书 》 , 维护 社会 大众 整形 美容 消费 利益 。\t \t \t \t $ LOTOzf $',
  2. '【 穿 高跟鞋 不磨 脚 小 方法 】 1 . 用 热 毛巾 在 磨 脚 的 部位 捂 几分钟 , 再拿块 干 的 软 毛巾 垫 着 , 用 锤子 把 鞋子 磨脚 的 地方 敲 平整 就 可以 啦 ;2 . 把 报纸 捏 成团 沾点 水 , 不要 太湿 , 但 要 整团 都 沾 到 水 , 再 拿 张干 的 报纸 裹住 湿 的 报纸 , 塞 在 挤 脚 部位 , 用 塑料袋 密封 一夜 ;3 . 穿鞋 之前 , 拿 香皂 ( 蜡烛 亦可 ) 在 磨脚 位置 薄薄的 涂上一层 。\t \t \t \t $ LOTOzf $',
  3. '要 在 有限 的 空间 里 实现 最大 的 价值 , 布 上网 线 、 音频线 、 高清 线 、 投影 线 、 电源线 、 闭 路线 等 一切 能够 想到 的 线 ;在 32 ㎡ 里 放 一套 沙发 和 预留 5 - 6 个人 的 办公 环境 ;5 ㎡ 里 做 一个 小 卧室 ;在 6 ㎡ 里装 一个 袖珍 厨房 和 一个 厕所 ;还要 在 2 米 * 5 米 的 阳台 上 做 一个 小 花园 ;除 阳台 外套 内 只有 43 ㎡ 的 房子 要 怎么 做 才能 合理 利用 ?$ LOTOzf $',
  4. '【 女人 命好 的 几点 特征 】 1 . 圆脸 ( 对 人际关系 及 财运 都 有加 分 ) ;2 . 下巴 丰满 ( 可能 会 拥有 两栋 以上 的 房产 ) ;3 . 臀大 ( 代表 有 财运 ) ;4 . 腿 不能 细 ( 腿 长脚 瘦 , 奔走 不停 , 辛苦 之相 也 ) ;5 . 小腹 有 脂肪 ( 状是 一种 福寿之 相 ) 。$ LOTOzf $',
  5. '中央 经济 工作 会议 12 月 12 日至 14 日 在 北京 举行 , 很 引人瞩目 的 一个 新 的 提法 是 , 要 提高 中等 收入者 比重 , 但是 股市 却 把 “ 中等 收入者 ” 一批 又 一批 地 变成 了 “ 低收入 人群 ” !$ LOTOzf $']

五、停止词使用

1 停止词是为了过滤掉已经确认对训练模型没有实际价值的分词
2 停止词作用:提高模型的精确度和稳定性

  1. # 加载停止词语料
  2. stoplist = [word.strip() for word in open(
  3. 'D:\\A\\AI-master\\py-data\\text_classification-master\\
  4. text classification\\stop\\stopword.txt', encoding='utf-8').readlines()]
  5. stoplist[:10]
['\ufeff,', '?', '、', '。', '“', '”', '《', '》', '!', ',']

六、编码器处理文本标签

  1. le = LabelEncoder()
  2. y_train_le = le.fit_transform(y_train)
  3. y_test_le  = le.fit_transform(y_test)
  4. y_train_le, y_test_le
  1. (array([1, 1, 1, ..., 2, 2, 2], dtype=int64),
  2. array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  3. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
  4. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  5. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  6. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  7. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  8. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
  9. 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2,
  10. 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
  11. 2, 2], dtype=int64))

文本数据转换成数据值数据矩阵

  1. count = CountVectorizer(stop_words=stoplist)
  2. '''注意:
  3. 这里要先 count.fit() 训练所有训练和测试集,保证特征数一致,
  4. 这样在算法建模时才不会报错
  5. '''
  6. count.fit(list(X_train_cut) + list(X_test_cut))
  7. X_train_count = count.transform(X_train_cut)
  8. X_test_count  = count.transform(X_test_cut)
  9. X_train_count = X_train_count.toarray()
  10. X_test_count  = X_test_count.toarray()
  11. print(X_train_count.shape, X_test_count.shape)
  12. X_train_count, X_test_count
  1. (3305, 23732) (200, 23732)
  2. (array([[0, 0, 0, ..., 0, 0, 0],
  3. [0, 0, 0, ..., 0, 0, 0],
  4. [0, 0, 0, ..., 0, 0, 0],
  5. ...,
  6. [1, 0, 0, ..., 0, 0, 0],
  7. [0, 0, 0, ..., 0, 0, 0],
  8. [0, 0, 0, ..., 0, 0, 0]], dtype=int64), array([[0, 0, 0, ..., 0, 0, 0],
  9. [0, 0, 0, ..., 0, 0, 0],
  10. [0, 0, 0, ..., 0, 0, 0],
  11. ...,
  12. [0, 0, 0, ..., 0, 0, 0],
  13. [0, 0, 0, ..., 0, 0, 0],
  14. [0, 0, 0, ..., 0, 0, 0]], dtype=int64))

七、常规算法模型

封装一个函数,提高复用率,使用时只需调用函数即可。

  1. # 用于存储所有算法的名字,准确率和所消耗的时间
  2. estimator_list, score_list, time_list = [], [], []
  3. def get_text_classification(estimator, X, y, X_test, y_test):
  4.     '''
  5.     estimator: 分类器,必选参数
  6.             X: 特征训练数据,必选参数
  7.             y: 标签训练数据,必选参数
  8.        X_test: 特征测试数据,必选参数
  9.         y_tes: 标签测试数据,必选参数
  10.        return: 返回值
  11.            y_pred_model: 预测值
  12.              classifier: 分类器名字
  13.                   score: 准确率
  14.                       t: 消耗的时间
  15.                   matrix: 混淆矩阵
  16.                   report: 分类评价函数
  17.     '''
  18.     start = time.time()
  19.     print('\n>>>算法正在启动,请稍候...')
  20.     model = estimator
  21.     print('\n>>>算法正在进行训练,请稍候...')
  22.     model.fit(X, y)
  23.     print(model)
  24.     print('\n>>>算法正在进行预测,请稍候...')
  25.     y_pred_model = model.predict(X_test)
  26.     print(y_pred_model)
  27.     print('\n>>>算法正在进行性能评估,请稍候...')
  28.     score = metrics.accuracy_score(y_test, y_pred_model)
  29.     matrix = metrics.confusion_matrix(y_test, y_pred_model)
  30.     report = metrics.classification_report(y_test, y_pred_model)
  31.     print('>>>准确率\n', score)
  32.     print('\n>>>混淆矩阵\n', matrix)
  33.     print('\n>>>召回率\n', report)
  34.     print('>>>算法程序已经结束...')
  35.     end = time.time()
  36.     t = end - start
  37.     print('\n>>>算法消耗时间为:', t, '秒\n')
  38.     classifier = str(model).split('(')[0]
  39.     return y_pred_model, classifier, score, round(t, 2), matrix, report
1、k近邻算法
  1. knc = KNeighborsClassifier()
  2. result = get_text_classification(knc, X_train_count, y_train_le, X_test_count, y_test_le)
  3. estimator_list.append(result[1]), score_list.append(result[2]), time_list.append(result[3])
  4. 算法正在启动,请稍候...算法正在进行训练,请稍候...KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski', metric_params=None, n_jobs=None, n_neighbors=5, p=2,                     weights='uniform')算法正在进行预测,请稍候...[1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 1 1 0 1 0 1 2 0 1 0 0 1 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 2 2 2 0 0 0 0 2 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 2 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 2 0 0 2 0 3 0 2 2 2 2 2 2 0 2 0 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 0 2 2 0 0 0 0 0 2 2 2 2]算法正在进行性能评估,请稍候...准确率 0.665混淆矩阵 [[99 0 16 0] [26 10 2 0] [ 8 0 23 0] [ 6 0 9 1]]召回率 precision recall f1-score support 0 0.71 0.86 0.78 115 1 1.00 0.26 0.42 38 2 0.46 0.74 0.57 31 3 1.00 0.06 0.12 16 accuracy 0.67 200 macro avg 0.79 0.48 0.47 200weighted avg 0.75 0.67 0.62 200算法程序已经结束...算法消耗时间为: 28.78205680847168
  5. (None, None, None)
2、决策树
  1. dtc = DecisionTreeClassifier()
  2. result = get_text_classification(dtc, X_train_count, y_train_le, X_test_count, y_test_le)
  3. estimator_list.append(result[1]), score_list.append(result[2]), time_list.append(result[3])
  1. 算法正在进行训练,请稍候...
  2. DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None,
  3. max_features=None, max_leaf_nodes=None,
  4. min_impurity_decrease=0.0, min_impurity_split=None,
  5. min_samples_leaf=1, min_samples_split=2,
  6. min_weight_fraction_leaf=0.0, presort=False,
  7. random_state=None, splitter='best')
  8. 算法正在进行预测,请稍候...
  9. [1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 2 1 1 0
  10. 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 2 2 0 0 0 1 0 2 0 0 2 0
  11. 1 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 3 3 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 2 0
  12. 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 1 1 0 1 1 1 1
  13. 1 0 0 0 0 1 3 1 3 2 3 3 3 3 3 0 3 2 2 2 3 2 1 2 1 2 2 2 2 2 1 2 2 2 2 2 3
  14. 3 2 2 0 1 2 3 3 0 2 1 0 2 2 2]
  15. 算法正在进行性能评估,请稍候...
  16. 准确率
  17. 0.735
  18. 混淆矩阵
  19. [[84 24 5 2]
  20. [ 1 35 1 1]
  21. [ 3 5 19 4]
  22. [ 1 2 4 9]]
  23. 召回率
  24. precision recall f1-score support
  25. 0 0.94 0.73 0.82 115
  26. 1 0.53 0.92 0.67 38
  27. 2 0.66 0.61 0.63 31
  28. 3 0.56 0.56 0.56 16
  29. accuracy 0.73 200
  30. macro avg 0.67 0.71 0.67 200
  31. weighted avg 0.79 0.73 0.74 200
  32. 算法程序已经结束...
  33. 算法消耗时间为: 20.55004119873047 秒
  34. Out[35]: (None, None, None)
3、多层感知器
  1. mlpc = MLPClassifier()
  2. result = get_text_classification(mlpc, X_train_count, y_train_le, X_test_count, y_test_le)
  3. estimator_list.append(result[1]), score_list.append(result[2]), time_list.append(result[3])
  4. 算法正在启动,请稍候...算法正在进行训练,请稍候...MLPClassifier(activation='relu', alpha=0.0001, batch_size='auto', beta_1=0.9, beta_2=0.999, early_stopping=False, epsilon=1e-08, hidden_layer_sizes=(100,), learning_rate='constant', learning_rate_init=0.001, max_iter=200, momentum=0.9, n_iter_no_change=10, nesterovs_momentum=True, power_t=0.5, random_state=None, shuffle=True, solver='adam', tol=0.0001, validation_fraction=0.1, verbose=False, warm_start=False)算法正在进行预测,请稍候...[1 1 2 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 0 0 0 1 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 1 0 0 0 0 0 1 0 0 0 0 0 0 3
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/238456?site
推荐阅读
相关标签
  

闽ICP备14008679号