赞
踩
在深度学习中,不需要主动提取特征。但是在传统的机器学习中,需要主动提取特征。
传统机器学习:需要手动进行特征工程,如果不知道哪些特征效果比较好,可以整理更多的特征
深度学习:自动学习有效的特征,所谓的向量表示过程就是自动学习有效的特征表示的过程。
常见的文本特征工程手段有
一般在中文中还需要进行分词。jieba分词可以对中文文本进行分词、词性标注、关键词抽取等,并且支持自定义词典。jieba分词支持四种分词模式:精确模式、全模式、搜索引擎模式、paddle模式。具体可参见https://github.com/fxsjy/jieba。
官方样例:
# encoding=utf-8 import jieba jieba.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_split pd.set_option('display.max_colwidth', -1) %matplotlib inline
将训练语料转化为词袋模型,矩阵中的元素可以是word counts或者tf-idf。
读取输入
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,)
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 1
2 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 1
1 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 1
1 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)]
我们使用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]]
Word2vec是一组用于生成词嵌入的相关模型(CBOW和Skipgram),它是词的分布式表示。在这里,我们使用gensim包来实现Word2vec。
from gensim.models import word2vec def 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 += 1 return 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 += 1 except Exception: pass if cc != 0: # 句子向量为词向量累加的平均 sen_vec /= cc return sen_vec def 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 += 1 return 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]]
这部分知识可以参考:
word2vec的同样理念可以扩展到文档中,我们不是学习单词的特征表示,而是学习句子或文档的特征表示。
from gensim.models.doc2vec import Doc2Vec, TaggedDocument def 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 += 1 return 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: pass return sen_vec def 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 += 1 return 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]]
主题模型用于分类可以参考: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)]
不了解的可以参考: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 ft train_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)
如果对您有帮助,麻烦点赞关注,这真的对我很重要!!!如果需要互关,请评论或者私信!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。