文章目录

  • 一、文本特征工程
  • 二、工具使用
    • 1.word counts与tf-idf
      • 1.1 读取输入与分词
      • 1.2 特征工程—CountVectorizer and TfidfTransformer
      • 1.3 构建分类器管道模型
    • 2. word2vec
    • 3. doc2vec
    • 4. LDA主题模型
    • 5.Fasttext

一、文本特征工程

  在深度学习中,不需要主动提取特征。但是在传统的机器学习中,需要主动提取特征。
传统机器学习:需要手动进行特征工程,如果不知道哪些特征效果比较好,可以整理更多的特征
深度学习:自动学习有效的特征,所谓的向量表示过程就是自动学习有效的特征表示的过程。
常见的文本特征工程手段有

  • tf-idf
  • word2vec
    利用skipgram或者CBOW来训练词向量,如果自己不想训练,可以用别人训练好的。
  • N-gram
  • POS词性(part of speech)
  • LDA主题特征
  • 文本统计特征(人工提取特征)
    诸如:文本长度、单词个数、数字个数、名词数等,可以根据下游任务进行选取
      在进行下游任务时,我们有很多特征可以使用,我们应该怎么组合在一起呢?我们可以将这些feature拼接在一起,特征串变成一个向量,这个向量用于模型训练。

  一般在中文中还需要进行分词。jieba分词可以对中文文本进行分词、词性标注、关键词抽取等,并且支持自定义词典。jieba分词支持四种分词模式:精确模式、全模式、搜索引擎模式、paddle模式。具体可参见https://github.com/fxsjy/jieba。
官方样例:

# encoding=utf-8
import jiebajieba.enable_paddle()# 启动paddle模式。 0.40版之后开始支持,早期版本不支持
strs=["我来到北京清华大学","乒乓球拍卖完了","中国科学技术大学"]
for str in strs:seg_list = jieba.cut(str,use_paddle=True) # 使用paddle模式print("Paddle Mode: " + '/'.join(list(seg_list)))seg_list = jieba.cut("我来到北京清华大学", cut_all=True)
print("Full Mode: " + "/ ".join(seg_list))  # 全模式seg_list = jieba.cut("我来到北京清华大学", cut_all=False)
print("Default Mode: " + "/ ".join(seg_list))  # 精确模式seg_list = jieba.cut("他来到了网易杭研大厦")  # 默认是精确模式
print(", ".join(seg_list))seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造")  # 搜索引擎模式
print(", ".join(seg_list))
【全模式】: 我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学【精确模式】: 我/ 来到/ 北京/ 清华大学【新词识别】:他, 来到, 了, 网易, 杭研, 大厦    (此处,“杭研”并没有在词典中,但是也被Viterbi算法识别出来了)【搜索引擎模式】: 小明, 硕士, 毕业, 于, 中国, 科学, 学院, 科学院, 中国科学院, 计算, 计算所, 后, 在, 日本, 京都, 大学, 日本京都大学, 深造

二、工具使用

  以一个文本分类任务为例,学习工具的使用

import pandas as pd
import numpy as np
# 中文分词
import jieba
import codecs
import os
# API算法库,可以进行TF-IDF,可以提已经训练好的word2vec,文本相似度计算等
import gensim
from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV, cross_val_score
from sklearn.pipeline import Pipeline
from sklearn.metrics import accuracy_score, confusion_matrix
from sklearn.model_selection import train_test_splitpd.set_option('display.max_colwidth', -1)
%matplotlib inline

1.word counts与tf-idf

  将训练语料转化为词袋模型,矩阵中的元素可以是word counts或者tf-idf。

1.1 读取输入与分词
  • 读取输入

    data_dir = 'materials'
    train_filepath = os.path.join(data_dir, 'training.csv')
    # 加载文件
    src_data = pd.read_csv(train_filepath, names=['text_label', 'text_content'], encoding='utf8')
    print(src_data.shape)
    print(src_data.head())
    # 计算训练集每个标签的数量,发现标签数量不均衡,需要采用一些样本均衡的手段
    pd.value_counts(src_data['text_label'].values)
    
    (4774, 2)text_label                                                                                                                                                                                                                                                                text_content
    0  2           合晟资产是一家专注于股票、债券等二级市场投资,为合格投资者提供专业资产管理服务的企业。公司业务范围包括资产管理、投资咨询和投资顾问服务。公司管理的私募基金产品主要包括股票型、债券型资产管理计划或证券投资基金,管理总资产规模80亿元左右。根据中国证券投资基金业协会数据,公司管理的私募证券投资基金(顾问管理)类规模较大,公司管理规模处于50亿元以上的第一梯队。
    1  2           公司的主营业务为向中小微企业、个体工商户、农户等客户提供贷款服务,自设立以来主营业务未发生过变化。
    2  1           公司立足于商业地产服务,致力于为商业地产开发、销售、运营全产业链提供一整套增值服务,业务覆盖商业定位及策划、商业设计、销售代理、招商代理电子商务、以及商业地产运管服务;同时开展应用互联网电商模式,采取O2O线上导流线下服务方式进行住宅类业务的创新营销服务。公司的业务板块包括商业地产策划顾问、专业招商及运营管理、代理销售、麦吉铺O2O电子商务。
    3  2           公司经工商管理部门核准的经营范围为“投资咨询、经济信息咨询,企业管理咨询,品牌推广策划,公共关系策划,文化交流策划咨询,企业形象策划,图文设计,会展服务(依法须经批准的项目,经相关部门批准后方可开展经营活动)”。公司的主营业务为:为国内上市公司提供投资者关系顾问服务。根据公司的主营业务,按照《国民经济行业分类》(GBT4754-2011),公司属于“商务服务业(L72)”分类下的“社会经济咨询(L7233)”。
    4  2           该公司的主营业务为在中国境内(港、澳、台除外)开展保险代理销售,依托于自身的产品研究能力和专业化服务能力,通过为团体或个人保险受众提供投保需求分析、投保方案制定、保险理赔、保单保全等一站式服务,最终为保险公司完成人身保险及财产保险等保险产品的代理销售综合服务。公司自成立以来,已与中国人民人寿保险股份有限公司、中德安联人寿保险有限公司、中英人寿保险有限公司、阳光人寿保险股份有限公司、中意人寿保险有限公司、同方全球人寿保险有限公司、中国泰康人寿保险股份有限公司等数十家保险公司建立了紧密的合作关系,并为其完成千余种保险产品的代理销售
    3     1271
    4     1268
    6     810
    7     303
    10    278
    5     227
    8     206
    9     163
    2     98
    11    96
    1     54
    dtype: int64
    
    # 从训练文本中抽取标签为3或4的文本用于后续操作,二分类任务
    src_data = src_data[src_data['text_label'].isin([3, 4])]
    # 统计标签的数量
    print(pd.value_counts(src_data['text_label'].values))
    
    3    1271
    4    1268
    dtype: int64
    
  • 分词
    加载停用词

    def read_file(file_path):"""reading file"""f = codecs.open(file_path, encoding='utf-8')lines = []for line in f:line = line.rstrip('\n').rstrip('\r')lines.append(line)return lines
    # 加载停用词
    stopwordsCN = read_file(os.path.join(data_dir, 'stopWords_cn.txt'))
    

    针对下游任务,加载自定义词典

    jieba.load_userdict(os.path.join(data_dir, 'ai100_words.txt'))
    

    去掉停用词,进行分词,返回以空格连接的字符串

    def cut_content(each_row, stopwords):"""word segmentation"""return ' '.join([word for word in jieba.lcut(each_row['text_content']) if word not in stopwords])
    # 去掉停用词,进行分词,返回以空格连接的字符串
    src_data['text_content_segmentation'] = src_data.apply(lambda row: cut_content(row, stopwordsCN), axis=1)
    print(src_data.head())
    
         text_label  ...                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         text_content_segmentation
    152  3           ...  杉工 智能 提供 交通 基础设施 城市 公共 基础设施 大型 土木工程 建筑物 结构 监测 系统 设计 咨询 实施 及运维 服务 行业 相关 智能 软硬件 设计 开发 生产 销售 主营业务 涵盖 技术咨询 系统 设计 系统实施 相关 软件 硬件 开发 生产 销售 服务 中国证监会 发布 上市公司 行业 分类 指引 2012 年 修订 公司 处 行业 I 信息 传输 软件 信息技术 服务业 中 I65 软件 信息技术 服务业 国民经济行业分类 代码 国家标准 GB T4754 2011 公司 处 行业 I 信息 传输 软件 信息技术 服务业 中 I65 软件 信息技术 服务业 挂牌 公司 管理型 行业 分类 指引 公司 处 行业 I 信息 传输 软件 信息技术 服务业 中 I65 软件 信息技术 服务业 2014 年度 2015 年度 2016 年 月 公司 主营业务收入 489 097.95 元 28 957 566.54 元 103 661.83 元 占 营业收入 比例 100% 报告 期内 公司 主营业务未发生重大变化
    153  4           ...  中国证监会 发布 上市公司 行业 分类 指引 2012 年 修订 公司 建筑 装饰 建筑业 行业 代码 E50 国家统计局 公布 国民经济行业分类 GB T4754 2011 公司 所属 行业 建筑 装饰业 行业 代码 E5010 挂牌 公司 管理型 行业 分类 指引 公司 建筑 装饰业 行业 代码 E5010 挂牌 公司 投资 型 行业 分类 指引 公司 建筑 工程 行业 行业 代码 12101210 公司 批准 经营范围 室内外 装饰 工程设计 施工 铝合金 塑钢门 窗 组装 设计 销售 施工 园林绿化 工程施工 建筑 幕墙 钢结构 组装 设计 销售 施工 环保 设备 装饰材料 玻璃 销售 五金交电 机械 电子产品 通信 设备 销售 安装 依法 须 批准 项目 相关 部门 批准 后方 经营 活动 公司 主营业务 建筑 幕墙 设计 施工 提供 幕墙 门窗 设计 施工 造价 咨询 幕墙 检修 维护 服务 报告 期内 主营业务收入 产品 服务 类别 分类 情况 单位 元 建筑 幕墙 收入 包括 建筑 幕墙 施工 幕墙 门窗 施工 幕墙 检修 维护 服务收入 外装 设计 收入 包括 建筑 幕墙 设计 幕墙 门窗 设计 造价 咨询 服务收入 报告 期内 公司 主营业务未发生重大变化
    155  3           ...  公司 主营业务 业务流程 管理 BPM 软件 研发 生产 销售 相关 服务 公司 服务 客户 分布 通信 油田 制造 食品 化工 物流 行业 领域 涵盖 大中型 国企 外企 各类 中小企业 规模 企业 事业单位 机构 各类 客户 提供 流程 中心 企事业单位 信息化 集成 解决方案 标准化 产品销售 产品 培训 实施 服务 售后服务 公司 企事业单位 管理 生产 决策 支持 领域 提供 一体化 信息 解决方案 提高 事业单位 领导人 管理 执行力 助力 各类 企事业单位 电子化 网络化 流程化 智能化 转型 管理 信息化 水平 提升 提升 企事业单位 管理 能力 增加 企事业单位 效益 2014 年度 2015 年度 公司 主营业务收入 882.25 万元 217.79 万元 主营业务收入 占 营业收入 比重 100% 成立 公司 主营业务未发生重大变化
    157  3           ...  曼恒 数字 国内 领先 虚拟现实 3D 打印 技术开发 服务提供商 公司 自主 开发 3D 计算机 图形 技术 快速 成型 技术 客户 提供 领先 虚拟现实 3D 打印 产品 服务 方案 公司 创始 2007 年 公司总部 位于 上海 北京 成都 广州 设有 子公司 武汉 济南 西安 哈尔滨 城市 设立 办事处 构建 完整 销售 服务网络 曼恒 数字 子公司 北京 曼恒 高新技术 企业 认定 软件 企业 认证 公司 子公司 合计 拥有 46 项 软件 著作权 18 项 软件产品 登记 证书 项 专利 公司 致力于 自主 产品 研发 技术创新 拥有 业内 规模 领先 技术 研发 团队 开发 DVS3D 虚拟现实 软件平台 G Magic 虚拟现实 交互 系统 G Bench 虚拟 工作台 G Motion 动作 捕捉 系统 3D 实感 赛车 射击 游戏 多款 国内首创 自主知识产权 虚拟现实 产品 拥有 共享 知识产权 3D 打印 设备 材料 提供 面向 行业 rp360 3Dcity 两个 互联网 平台 曼恒 数字 成立 始终 客户 体验 至上 价值 导向 挖掘 客户 需求 高端 制造 高等教育 国防 军队 医疗 行业 提供 专业级 3D 产品 技术 商业 提供 消费 级 3D 娱乐 产品 公司 客户 包括 中航 商发 国家电网 中国 商飞 迪士尼 中广核 中石化 中 石油 中联重科 佳豪 船舶 大众汽车 易趣网 eBay 华为 浙江大学 上海交通大学 武汉大学 同济大学 万达 玩家 客户群 涵盖 国内外 大型 企业 集团 知名 院校 科研院所 商业 娱乐场所 知名 客户 合作 曼恒 数字 始终 站 技术 发展 前沿 强化 3D 领域 核心 竞争力
    158  3           ...  公司 国内 领先 数据安全 技术 产品 服务提供商 金融 政府 电信 能源 制造 大型 行业 客户 提供数据 加密 数据安全 防护 数据 防 泄漏 数据 综合 防护 产品 解决方案 服务
    [5 rows x 3 columns]
    
  • 训练与测试集分割

    X = src_data['text_content_segmentation']
    y = src_data['text_label']
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
    print(f'X_train shape: {X_train.shape}, X_test shape: {X_test.shape}')
    
    X_train shape: (2031,), X_test shape: (508,)
    
1.2 特征工程—CountVectorizer and TfidfTransformer
  • CountVectorizer
    将文本转化为词频矩阵

    # 默认unigrams
    count_vect = CountVectorizer()
    # CountVectorizer会将文本中的词语转换为词频矩阵,它通过fit_transform函数计算各个词语出现的次数。
    X_train_counts = count_vect.fit_transform(X_train)
    print(X_train_counts)
    
      (0, 4057)        6(0, 7474)      1(0, 15024) 1(0, 10060) 1(0, 12978) 1(0, 6368)      1(0, 14600) 2(0, 9726)      6(0, 8510)      1(0, 5811)      3(0, 14584) 1(0, 14038) 1(0, 9149)      1(0, 15366) 2(0, 14042) 1(0, 14663) 1(0, 14086) 1(0, 11685) 1(0, 14094) 1(0, 15869) 1(0, 10066) 1(0, 12630) 4(0, 3497)      1(0, 3683)      1(0, 3410)      3:  :(2030, 6686)   1(2030, 12162)  1(2030, 8959)   1(2030, 6508)   1(2030, 3067)   1(2030, 13383)  1(2030, 12265)  1(2030, 8509)   1(2030, 10900)  1(2030, 1568)   1(2030, 2145)   1(2030, 6569)   1(2030, 7693)   1(2030, 7694)   3(2030, 7695)   2(2030, 7163)   2(2030, 7696)   2(2030, 9617)   2(2030, 1579)   1(2030, 12009)  1(2030, 14012)  1(2030, 3754)   1(2030, 5210)   1(2030, 6979)   1(2030, 2829)   1
    
    # 单词到特征索引的映射
    word2id = count_vect.vocabulary_
    # 特征索引到单词的映射
    id2word = dict(zip(word2id.values(), word2id.keys()))
    

    以第一个文本为例,展示CountVectorizer过程

    # 以第一个样本为例
    sample_1 = X_train_counts.toarray()[0, :]
    # 返回非零单词索引
    word_idx = np.nonzero(sample_1)[0]
    print(word_idx)
    
    (array([   15,    16,    91,   103,   132,   165,   166,   172,   177,202,   218,   304,   313,   317,   343,   355,   370,   386,412,   430,   431,   452,   464,   469,   475,   510,   520,526,   556,   574,   577,   606,   624,   710,   756,   785,796,   815,   825,   852,   871,   876,   911,  1000,  1005,1008,  1059,  2444,  2660,  2795,  2875,  3169,  3410,  3420,3497,  3615,  3616,  3683,  4057,  4335,  4638,  5811,  6068,6113,  6132,  6212,  6213,  6368,  6545,  6630,  6867,  7067,7103,  7107,  7168,  7474,  7666,  7740,  8002,  8194,  8266,8283,  8338,  8510,  8877,  8878,  9149,  9726, 10060, 10066,10300, 10314, 10793, 10921, 11173, 11254, 11676, 11685, 11992,12571, 12630, 12978, 13036, 13403, 13720, 13724, 13831, 14000,14038, 14042, 14086, 14094, 14273, 14584, 14600, 14603, 14663,14749, 14945, 15024, 15366, 15665, 15711, 15869, 15878, 15885],dtype=int64),)
    

    word counts

    word_counts = sample_1[np.nonzero(sample_1)]
    print(word_counts)
    
    [1 1 1 1 1 2 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 12 1 1 1 1 2 1 1 1 3 1 1 1 1 1 3 1 1 1 1 1 6 1 1 3 2 1 1 1 1 1 1 1 1 2 1 11 1 2 1 1 1 1 1 1 1 2 1 1 6 1 1 1 1 1 1 1 1 1 1 1 1 4 1 2 1 1 1 1 1 1 1 11 1 1 2 1 1 1 1 1 2 2 1 1 1 2]
    

    当然,我们可以根据单词索引与单词数目来得到文本

    sample_1_text = []
    for e_0, e_1 in zip(word_idx, word_counts):sample_1_text.extend([id2word[e_0]] * e_1)
    print(sample_1_text)
    
    ['009', '01', '10', '104', '118', '13', '13', '130', '134', '138', '16', '17', '2013', '2014', '2015', '22', '232', '25', '267', '29', '30', '300', '315', '327', '332', '340', '370', '38', '385', '41', '427', '43', '46', '476', '57', '617', '65', '66', '68', '68', '694', '73', '755', '76', '80', '80', '91', '916', '92', '99', '99', '99', '专业', '中国', '中铁', '主营业务收入', '交通运输', '企业', '企业', '企业', '企业管理', '会计', '余家', '余年', '依托', '公司', '公司', '公司', '公司', '公司', '公司', '净利润', '制造', '咨询', '咨询', '咨询', '国内', '国内', '国开', '国美', '地为', '地产', '基础', '多个', '大中型', '始终', '实施', '实施', '审计', '客户', '家电', '工商管理', '年度', '年度', '广泛应用', '当期', '恒大', '成功', '成本', '房地产', '技术开发', '提供', '提供', '提供商', '数据处理', '服务', '服务', '服务', '服务', '服务', '服务', '核准', '核心', '比例', '毛利率', '海尔集团', '深耕', '烟草', '煤炭', '电器', '电子产品', '相关', '等央企', '管理', '管理', '管理', '管理', '经营范围', '绩效', '绩效', '能源', '营业', '营业收入', '行业', '解决方案', '计算机系统', '计算机软件', '设备', '设立', '财务报告', '转让', '软件', '软件', '软件产品', '辅助', '运维', '通讯', '部门', '销售', '销售', '集团', '集团', '零售', '预算', '领先', '领域', '领域']
    
  • tf-idf

    tfidf_transformer = TfidfTransformer()
    X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts)
    sample_1 = X_train_tfidf.toarray()[0, :]
    # 返回非零单词索引
    word_idx = np.nonzero(sample_1)[0]
    # 返回tfidf向量
    word_tfidf = sample_1[np.nonzero(sample_1)]
    
1.3 构建分类器管道模型

  我们使用Logistic回归模型来构建模型,并构建一个用于特征提取和模型构建的管道。

text_clf = Pipeline([('word_counter', CountVectorizer()),('tfidf_computer', TfidfTransformer()),('clf', LogisticRegression())])
# 训练
text_clf = text_clf.fit(X_train, y_train)
# 预测
y_pred = text_clf.predict(X_test)print('accuracy %s' % accuracy_score(y_pred, y_test))
labels = y_train.unique()
print('Labels: ', labels)
# 混淆矩阵
print(confusion_matrix(y_test, y_pred, labels=labels))
accuracy 0.9645669291338582
Labels:  [3 4]
[[227  11][  7 263]]

2. word2vec

  Word2vec是一组用于生成词嵌入的相关模型(CBOW和Skipgram),它是词的分布式表示。在这里,我们使用gensim包来实现Word2vec。

from gensim.models import word2vecdef get_data_sentences(input_data):"""得到输入句子:param input_data: 输入文件:return:"""rtn_sentence = []cc = 0# 将DataFrame 作为(index, Series) pairs来进行迭代for curr_index, curr_row in input_data.iterrows():rtn_sentence.append(curr_row['text_content_segmentation'].split())cc += 1return rtn_sentence, cc# 得到分词后的输入句子
training_sentences, training_count = get_data_sentences(src_data)
print('training sentence counts:{}'.format(training_count))# 训练word2vec模型
model_size = 100
# vector_size:单词向量维度;min_count:忽略所有总频率低于此的单词
word2vec_model = word2vec.Word2Vec(training_sentences, vector_size=model_size, min_count=3)def get_sentence_vector(sen, dim):"""average word vectors to sentence vector"""# 初始化句子向量sen_vec = np.zeros(dim).reshape((1, dim))# 统计单词数目cc = 0# 循环遍历每个句子的单词for word in sen:try:# 单词和嵌入之间的映射,将每个单词编码为(1,100)的向量sen_vec += word2vec_model.wv[word].reshape((1, dim))cc += 1except Exception:passif cc != 0:# 句子向量为词向量累加的平均sen_vec /= ccreturn sen_vecdef get_sentence_vectors(data_sentences, model_size):"""获得训练集的词向量编码"""sentences_vector = []# 统计句子的数量cc = 0# 循环遍历每一个句子for each_sen in data_sentences:# 获取每个句子的词向量sentences_vector.append(get_sentence_vector(each_sen, model_size))cc += 1return sentences_vector, cc# 将训练集用word2vec进行词向量编码
X_train_sentences_vector, X_train_count = get_sentence_vectors(X_train, model_size)
print('training sentence counts:{}'.format(X_train_count))# 将测试集用word2vec进行词向量编码
X_test_sentences_vector, X_test_count = get_sentence_vectors(X_test, model_size)
print('testing sentence counts:{}'.format(X_test_count))text_clf = LogisticRegression()
# 训练
text_clf.fit(np.squeeze(X_train_sentences_vector), y_train)
# 预测
y_pred = []
for each_sen_vec in X_test_sentences_vector:pre_res = text_clf.predict(each_sen_vec)y_pred.append(pre_res[0])# 评估
print('accuracy %s' % accuracy_score(y_pred, y_test))
labels = y_train.unique()
print('Labels: ', labels)
print(confusion_matrix(y_test, y_pred, labels=labels))
training sentence counts:2539
training sentence counts:2031
testing sentence counts:508
accuracy 0.7165354330708661
Labels:  [3 4]
[[180  58][ 86 184]]

3. doc2vec

这部分知识可以参考:

  • Multi-Class Text Classification Model Comparison and Selection
  • https://radimrehurek.com/gensim/models/doc2vec.html

  word2vec的同样理念可以扩展到文档中,我们不是学习单词的特征表示,而是学习句子或文档的特征表示。

from gensim.models.doc2vec import Doc2Vec, TaggedDocumentdef get_data_sentences(input_data):"""得到输入句子:param input_data: 输入文件:return:"""rtn_sentence = []cc = 0# 将DataFrame 作为(index, Series) pairs来进行迭代for curr_index, curr_row in input_data.iterrows():rtn_sentence.append(curr_row['text_content_segmentation'].split())cc += 1return rtn_sentence, cc# 得到分词后的输入句子
training_sentences, training_count = get_data_sentences(src_data)
print('training sentence counts:{}'.format(training_count))documents = [TaggedDocument(doc, [i]) for i, doc in enumerate(training_sentences)]
# 训练Doc2Vec模型
model_size = 100
# vector_size:单词向量维度;min_count:忽略所有总频率低于此的单词
doc2vec_model = Doc2Vec(documents, vector_size=model_size, min_count=3)
#
def get_sentence_vector(sen, dim):# 循环遍历每个句子的单词sen_list = []for word in sen:sen_list.append(word)try:# 单词和嵌入之间的映射,将每个单词编码为(1,100)的向量sen_vec = doc2vec_model.infer_vector(sen_list).reshape(1,dim)except Exception:passreturn sen_vecdef get_sentence_vectors(data_sentences, model_size):"""获得训练集的句子向量编码"""sentences_vector = []# 统计句子的数量cc = 0# 循环遍历每一个句子for each_sen in data_sentences:# 获取每个句子的词向量sentences_vector.append(get_sentence_vector(each_sen, model_size))cc += 1return sentences_vector, cc# 将训练集用Doc2Vec进行词向量编码
X_train_sentences_vector, X_train_count = get_sentence_vectors(X_train, model_size)
print('training sentence counts:{}'.format(X_train_count))# 将测试集用Doc2Vec进行词向量编码
X_test_sentences_vector, X_test_count = get_sentence_vectors(X_test, model_size)
print('testing sentence counts:{}'.format(X_test_count))text_clf = LogisticRegression()
# 训练
text_clf.fit(np.squeeze(X_train_sentences_vector), y_train)
# 预测
y_pred = []
for each_sen_vec in X_test_sentences_vector:pre_res = text_clf.predict(each_sen_vec)y_pred.append(pre_res[0])# 评估
print('accuracy %s' % accuracy_score(y_pred, y_test))
labels = y_train.unique()
print('Labels: ', labels)
print(confusion_matrix(y_test, y_pred, labels=labels))
training sentence counts:2539
training sentence counts:2031
testing sentence counts:508
accuracy 0.8523622047244095
Labels:  [3 4]
[[203  35][ 40 230]]

4. LDA主题模型

主题模型用于分类可以参考:Using LDA Topic Models as a Classification Model Input

# 获取所有文本
list_corpus = []
for ele in X:list_corpus.append(ele.split())# 实现单词和它们的整数id之间的映射
id2word = gensim.corpora.Dictionary(list_corpus)
# 根据频率过滤出字典
id2word.filter_extremes(no_below=3, no_above=0.35)
# 为所有单词分配新单词id
id2word.compactify()
# 将文档转换为单词袋(BOW)格式= (token_id, token_count)元组的列表
corpus = [id2word.doc2bow(text) for text in list_corpus]
print(corpus)
# LDA算法的优化实现,能够利用多核cpu的能力
lda_train = gensim.models.ldamulticore.LdaMulticore(corpus=corpus,num_topics=2,id2word=id2word,chunksize=100,workers=7,passes=1,eval_every=1,per_word_topics=True)# 获取最重要的主题
# num_topics要包含的主题数目
# num_words:每个主题包含的单词数目
lda_train.print_topics(num_topics=11, num_words=15)
[(0,'0.013*"设备" + 0.011*"制造" + 0.010*"年" + 0.007*"领域" + 0.006*"平台" + 0.006*"互联网" + 0.006*"系统" + 0.006*"国内" + 0.006*"包括" + 0.006*"工业" + 0.005*"自动化" + 0.005*"设计" + 0.005*"专业" + 0.005*"游戏" + 0.005*"成立"'),(1,'0.014*"系统" + 0.011*"软件" + 0.011*"工程" + 0.010*"解决方案" + 0.008*"管理" + 0.008*"平台" + 0.008*"设计" + 0.008*"开发" + 0.008*"领域" + 0.007*"建筑" + 0.007*"年" + 0.007*"项目" + 0.007*"专业" + 0.007*"信息化" + 0.007*"相关"')]
# 获取给定文档的主题分布
# bow:(token_id, token_count)元组的列表;
# minimum_probability:分配的概率低于此阈值的主题将被丢弃。
lda_train.get_document_topics(bow=corpus[0], minimum_probability=0.0)
[(0, 0.005405969), (1, 0.99459404)]

5.Fasttext

不了解的可以参考:Fasttext快速入门
  Fasttext是一个高效学习单词表示和句子分类的库

# 将数据写入文件
def write_to_file(file_name, input_x, input_y):"""write to fasttext format"""with codecs.open(file_name, mode='w', encoding='utf-8') as fout:for ele in zip(input_x, input_y):fout.write("__label__" + str(ele[1]) + ' ' + ele[0] + '\n')# write training file
write_to_file(os.path.join(data_dir, 'fasttext.train'), X_train, y_train)# write testing file
write_to_file(os.path.join(data_dir, 'fasttext.test'), X_test, y_test)import fasttext as fttrain_file = os.path.join(data_dir, 'fasttext.train')
output = os.path.join(data_dir, 'fasttest.model')
test_file = os.path.join(data_dir, 'fasttext.test')print('training---------')
# Train the classifier
classifier = ft.train_supervised(train_file)print('testing---------------')
# Test the classifier
result = classifier.test(test_file)
print(result)
training---------
testing---------------
(508, 0.9389763779527559, 0.9389763779527559)

如果对您有帮助,麻烦点赞关注,这真的对我很重要!!!如果需要互关,请评论或者私信!


NLP—3.文本特征工程及工具使用举例相关推荐

  1. NLP学习笔记6--Lecture/语言模型/预处理/独热编码/word2vec/文本特征工程

    语言模型用来判断:是否一句话从语法上通顺 先分词  然后算出联合概率 怎么算? chain rule 条件很长的时候 会遇到一个问题 sparsity 数据的稀疏性 用马尔科夫假设  最简单的假设 之 ...

  2. 特征工程(二) :文本数据的展开、过滤和分块

    如果让你来设计一个算法来分析以下段落,你会怎么做? Emma knocked on the door. No answer. She knocked again and waited. There w ...

  3. AI基础:特征工程-文本特征处理

    0.导语 特征工程到底是什么呢?顾名思义,其本质是一项工程活动,目的是最大限度地从原始数据中提取特征以供算法和模型使用. 在此之前,我已经写了以下几篇AI基础的快速入门,本篇文章讲解特征工程基础第三部 ...

  4. 【数据竞赛】Kaggle实战之特征工程篇-20大文本特征(下)

    作者:尘沙杰少.樱落.新峰.DOTA.谢嘉嘉 特征工程--文本特征下半篇! 前 言 这是一个系列篇,后续我们会按照我们第一章中的框架进行更新,因为大家平时都较忙,不会定期更新,如有兴趣欢迎长期关注我们 ...

  5. 面向机器学习的特征工程 三、文本数据: 展开、过滤和分块

    来源:ApacheCN<面向机器学习的特征工程>翻译项目 译者:@kkejili 校对:@HeYun 如果让你来设计一个算法来分析以下段落,你会怎么做? Emma knocked on t ...

  6. 机器学习之朴素贝叶斯(一):朴素贝叶斯的介绍、概率基础(拉普拉斯平滑)、sklearn朴素贝叶斯实现API、朴素贝叶斯分类的优缺点、文本的特征工程

    朴素贝叶斯 文章目录 朴素贝叶斯 一.介绍 1.1 文本分类的应用 词云的例子 垃圾邮件分类 文章类别的概率 二.概率基础 2.1 概率例题 2.2 联合概率和条件概率 2.3 朴素贝叶斯-贝叶斯公式 ...

  7. 机器学习实战 | 自动化特征工程工具Featuretools应用

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/41 本文地址:https://www.showmeai.tech/article-d ...

  8. 【NLP】 文本分类 主题预测 综述

    文本分类解决方法综述 一.传统文本分类方法 文本分类问题算是自然语言处理领域中一个非常经典的问题了,相关研究最早可以追溯到上世纪50年代,当时是通过专家规则(Pattern)进行分类,甚至在80年代初 ...

  9. NLP中的文本分析和特征工程

    语言检测,文本清理,长度测量,情绪分析,命名实体识别,n字频率,词向量,主题建模 前言 在本文中,我将使用NLP和Python解释如何分析文本数据并为机器学习模型提取特征. NLP(自然语言处理)是人 ...

  10. NLP的文本分析与特征工程

    作者|Mauro Di Pietro 编译|VK 来源|Towards Data Science 摘要 在本文中,我将使用NLP和Python解释如何为机器学习模型分析文本数据和提取特征. 自然语言处 ...

最新文章

  1. 程序员部落酋长 Joel 之洞见
  2. linux下防火墙加白名单
  3. MAVEN构建的各个环节及常用maven命令
  4. java -jar 和 java -cp用法
  5. 解决magento保存产品时耗时很长的问题
  6. c#随机数生成编号_忘掉 Snowflake,感受一下性能高出587倍的全局唯一ID生成算法...
  7. scala 辅助构造函数_Scala辅助构造函数的深入介绍
  8. 樊登读书赋能读后感_一场人均4万元的知识盛宴,樊登直播首秀到底讲了什么?...
  9. fiddler响应中文乱码问题
  10. 制作字幕html怎么使用教程,anSuber字幕编辑软件使用详解
  11. 微信聊天小程序——(五、添加好友)
  12. python绘制太阳花,Python turtle学习笔记(包含太阳花的绘制,玫瑰花的绘制)
  13. STM32F103访问W25Q64
  14. 我的编程经历与我所热爱的游戏服务端开发
  15. 解决Microsoft.NET Framework 3.5Service Pack1失败问题
  16. Excel函数大全-10查找和引用函数
  17. 用户在图片上点选并标记位置,js实现
  18. 4070ti和3080性能差多少 rtx4070ti和rtx3080区别对比
  19. 2进制 16进制 计算机术语,十六进制转二进制计算器
  20. 英语翻译太难?我一怒之下用爬虫写了两个翻译脚本

热门文章

  1. Android基础类之BaseAdapter
  2. C++ 各种数据类型须知
  3. PHP多线程pthreads
  4. 老马的原创空间搬家通告
  5. uva297(quadtree)
  6. Ansi,UTF8,Unicode,ASCII编码的差别
  7. [译] 第二天:AngularJS - 认识AngularJS
  8. MSSQL数据库中row_number()函数
  9. JAVA基础--JAVA中的反射机制详解(转)
  10. winform中的小技巧【自用】