写在前面:笔者最近在梳理自己的文本挖掘知识结构,借助gensim、sklearn、keras等库的文档做了些扩充,会陆陆续续介绍文本向量化、tfidf、主题模型、word2vec,既会涉及理论,也会有详细的代码和案例进行讲解,希望在梳理自身知识体系的同时也能对想学习文本挖掘的朋友有一点帮助,这是笔者写该系列的初衷。
在本文中,笔者将会紧接着上文提及的3个概念,拓展到文本挖掘中一个重要的概念 ---(文本)向量空间,它是将自然语言转化为机器可识别符号的关键一步,文本相似度、文本聚类、文本分类等实际应用皆以此为基础。
培养码代码的好习惯,设置日志,打印程序运行中的细节,以便调试代码。
import logginglogging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
import osimport tempfileTEMP_FOLDER = tempfile.gettempdir()print('文件夹"{}" 将被用来存储语料和临时性的字典'.format(TEMP_FOLDER))
文件夹"C:\Users\hp\AppData\Local\Temp" 将被用来存储语料和临时性的字典
一、从字符串到向量(From Strings to Vectors)
这次,笔者还是使用之前关于“知识图谱”报道的标题语料库作为示例:
from gensim import corporaimport jieba
2019-05-06 09:59:43,964 : INFO : 'pattern' package not found; tag filters are not available for English
根据打印出的日志可知,'pattern'没正确安装上,这个库是自然语言处理里一个很棒的库,不过目前没怎么更新了,且对中文的支持不给力,所以不影响接下来的分析。
jieba.add_word('知识图谱') #防止“知识图谱”被切错词docs = ['商业新知:知识图谱为内核,构建商业创新服务完整生态。','如何更好利用知识图谱技术做反欺诈? 360金融首席数据科学家沈赟开讲。','知识管理 | 基于知识图谱的国际知识管理领域可视化分析。','一文详解达观数据知识图谱技术与应用。','知识图谱技术落地金融行业的关键四步。','一文读懂知识图谱的商业应用进程及技术背景。','海云数据CPO王斌:打造大数据可视分析与AI应用的高科技企业。','智能产业|《人工智能标准化白皮书2018》带来创新创业新技术标准。','国家语委重大科研项目“中华经典诗词知识图谱构建技术研究”开题。','最全知识图谱介绍:关键技术、开放数据集、应用案例汇总。','中译语通Jove Mind知识图谱平台 引领企业智能化发展。','知识图谱:知识图谱赋能企业数字化转型,为企业升级转型注入新能量。']
再对文本进行分词,用空格隔开变成字符串,方便进行下一步的处理:
documents = [' '.join(jieba.lcut(i)) for i in docs]documents
['商业 新知 : 知识图谱 为 内核 , 构建 商业 创新 服务 完整 生态 。',
'如何 更好 利用 知识图谱 技术 做 反 欺诈 ? 360 金融 首席 数据 科学家 沈赟 开讲 。',
'知识 管理 | 基于 知识图谱 的 国际 知识 管理 领域 可视化 分析 。',
'一文 详解 达观 数据 知识图谱 技术 与 应用 。',
'知识图谱 技术 落地 金融 行业 的 关键 四步 。',
'一文 读懂 知识图谱 的 商业 应用 进程 及 技术 背景 。',
'海云 数据 CPO 王斌 : 打造 大 数据 可视 分析 与 AI 应用 的 高科技 企业 。',
'智能 产业 | 《 人工智能 标准化 白皮书 2018 》 带来 创新 创业 新 技术标准 。',
'国家语委 重大 科研项目 “ 中华 经典 诗词 知识图谱 构建 技术 研究 ” 开题 。',
'最全 知识图谱 介绍 : 关键技术 、 开放 数据 集 、 应用 案例 汇总 。',
'中译 语通 Jove Mind 知识图谱 平台 引领 企业 智能化 发展 。',
'知识图谱 : 知识图谱 赋能 企业 数字化 转型 , 为 企业 升级 转型 注入 新 能量 。']
这是一个包含12个文档的小型语料,每个文档仅包含1个语句。
首先,对这些文档进行分词处理,移除停用词,并去掉那些仅在本语料中出现一次的词汇:
# 移除常用词以及分词stoplist = [i.strip() for i in open('datasets/stopwords_zh.txt',encoding='utf-8').readlines()]texts = [[word for word in document.lower().split() if word not in stoplist]for document in documents]# 移除仅出现一次的词汇from collections import defaultdictfrequency = defaultdict(int)for text in texts:for token in text: frequency[token] += 1texts = [[token for token in text if frequency[token] > 1] for text in texts]from pprint import pprint #使打印的格式更齐整pprint(texts)
[['商业', '知识图谱', '商业', '创新'],
['知识图谱', '技术', '金融', '数据'],
['知识', '管理', '知识图谱', '知识', '管理', '分析'],
['一文', '数据', '知识图谱', '技术'],
['知识图谱', '技术', '金融'],
['一文', '知识图谱', '商业', '技术'],
['数据', '数据', '分析', '企业'],
['创新&