基于词汇的文本语义分析

来源:微信公众号“科赛Kesci”

基于中文维基,构建知识图谱,寻找15万个词向量之间的运算关系,云脑机器学习实战训练营第二课带来「中文维基知识图谱构建挑战」。

我们请导师对第二波挑战中的作品做了一波点评,来扒一扒别人家的作业强在哪。

作品链接如下,你可点击阅读原文,或复制链接至浏览器,登录科赛 Kesci查看

https://www.kesci.com/apps/home/project/5a1d0e90d0178b641c3bb8d5

项目介绍

将所有的中文维基作为语料,并将维基条目名作为字典进行向量化,词向量用于将词或短语映射到一个固定维度的向量上,将词汇和短语用离散的数字表示能够在一些任务(如寻找近似词)上相较于传统方法取得显著的优势。

相较于英文语料,中文语料需要进行额外的分词和繁简转换步骤,经过预处理后,使用千万条级维基的正文来生成训练数据,并使用训练数据的一部分作为测试数据集。完成模型的训练后,可以得到了近15万个词向量,根据向量之间的距离可以构建基于词语关系的知识图谱,从而进行基于词汇的文本语义分析。

数据预处理

1.分解数据

将整个xml文件按page分开,每个page对应一个xml文件,存放在几个文件夹内,同时生成对应的索引文件(id_title_map.csv)

2.清理数据

将page分类,包括:重定向页面,帮助页面,词条页面(上述数据集中的ID_Title_Map_Pruned.csv,格式为folderID:pageID,title. eg:1:13,数学)

3.抽取关系链接图

记录图的节点信息,即重定向点(指同一个实体有多个表述方式),入度和出度信息

4.抽取文本

对文本的清理工作,包括分词,去标点空格,英文字母处理等等,得到干净的文本,放到一个txt(pagesTextCleanAnchorID.txt)中,一行代表一个page的文本,同时生成对应索引文件(pagesTextCleanAnchorID_Index.txt)

5.扩充词条

上一步得到得txt每一行包含词条数目大于1的内容中的词条文本替换成AnchorID,得到上述数据集中的pagesTextCleanAnchorID_tittle_extend.txt,eg:"数学 是 利用 符号语言 研究 326166 130077130654 以及...",原文本为“数学是利用符号语言研究数量、结构、变化以及..."

6.处理title

将page内容中包含title本身的汉字替换成titleID(由于title本质上也是anchor,所以这里也可以当作anchorID来理解)。

7.仅留anchor

将page内容中的汉字都去掉,仅留下anchorID,得到上述数据集中的WikiDict_pagesOnlyAnchorID_tittle_extend.txt

导师点评

这位同学做了比较详细的数据处理流程的描述。在这个项目中,虽然大部分的预处理工作我们已经做好,但是,理解数据处理的流程也非常关键。在实际的工作中,我们所得到的原始数据与最终模型的需求之间,往往有较大的差距。随着工作的进行,经常需要回过头来对数据处理的流程进行调整修补。这样,有一份细致的数据处理文档就非常重要,不但方便了后面项目成员的理解,同时回顾自己的工作时也比较省力。

模型包的选择

class gensim.models.word2vec.

Word2Vec(sentences=None, size=100, alpha=0.025, window=5, min_count=5, max_vocab_size=None, sample=0.001, seed=1, workers=3, min_alpha=0.0001, sg=0, hs=0, negative=5, cbow_mean=1, hashfxn=\, iter=5, null_word=0, trim_rule=None, sorted_vocab=1, batch_words=10000, compute_loss=False)

  • sg 决定运行的模型算法. 默认(sg=0), 使用CBOW. 否则 (sg=1), 使用skip-gram.

  • size 特征的维度,也就是一个单词向量的纬度。本实验建议为64(但我平时做实验一般取得128/256).

  • window 句子中当前单词和被预测单词的最大距离.

  • alpha 初始学习率 (会随着训练的进行线性减小到min_alpha).

  • seed 随机数生成种子.

  • min_count 忽略出现次数小于这个数目的单词.

  • max_vocab_size 最单词数,是为了限制单词太大占内存,假如实际单词超过这个数字,去掉出现次数最小的。一千万单词大概需要1GB内存

  • sample 高频词是否进行亚采样(downsampled)的阈值.默认为1e-3, 范围(0, 1e-5).

  • workers 使用多少个线程训练模型(在多核机器上跑的更快~,我下面的参数设置就是机器有几核,咱就开几个线程).

  • hs 如果为1, 会使用hierarchical softmax进行模型训练. 如果设为0 (默认), 并且negative为非零数, 会使用negative sampling.

  • negative 如果>0, 使用negative sampling, 这个整数代表多少“noise words”会被删除 (通常设为5-20之间的数值). 默认为5. 设为0, 不使用negative samping.

  • cbow_mean 如果为0, 使用上下文单词向量的和. 如果为1 (默认), 使用上下文单词向量的平均值. 只在cbow被使用的时候生效

  • hashfxn 用来随机初始化权值的hash function,用于增强学习的再现性.

  • iter 迭代次数,默认为5.

  • sorted_vocab 如果为1 (默认), 为单词设置index之前先按单词出现频率降序排列单词.

  • batch_words 传到线程的数据batch大小. 默认为10000.

导师点评

这次作业中,很多同学选择了gensim包作为模型的实现。这是一个做word2vec比较受欢迎的选择,没有什么问题。但是选择现成的包时,需要比较好地去理解哪些参数可以调,这些参数的含义是怎样的,以加深对于模型的理解。这位同学做得比较好的地方是她很详细地列出了这些参数的说明,为后面模型的应用和调参打下了比较好的基础。

模型的训练

导师点评

这位同学记录了模型训练所花费的时间。这里建议最好能够把模型训练过程中的loss下降的情况也能够打印出来。通过观察模型训练的过程,可以帮助我们找到一些线索,如果我们在前面处理过程中有一些缺陷也容易发现。

模型效果的评估

王力宏 & 李玟 : 0.946530

王力宏 & 蕭亞軒 : 0.942849

王力宏 & 張惠妹 : 0.939810

王力宏 & 周华健 : 0.938387

王力宏 & 孙燕姿 : 0.937986

王力宏 & 王菲 : 0.928927

王力宏 & 辛曉琪 : 0.926367

王力宏 & 陶喆 : 0.925689

王力宏 & 張韶涵 : 0.925686

王力宏 & 范瑋琪 : 0.925610

蔡依林 & 蕭亞軒 : 0.948877

蔡依林 & 林宥嘉 : 0.932087

蔡依林 & 潘瑋柏 : 0.927098

蔡依林 & 張惠妹 : 0.919681

蔡依林 & 王心凌 : 0.915485

蔡依林 & 孙燕姿 : 0.906726

蔡依林 & 田馥甄 : 0.904995

蔡依林 & 羅志祥 : 0.904079

蔡依林 & 五月天 : 0.903583

蔡依林 & 黃麗玲 : 0.903006

歌手 & 創作歌手 : 0.894803

歌手 & 台灣歌手列表 : 0.858475

歌手 & 女歌手 : 0.856085

歌手 & 流行樂團 : 0.827676

歌手 & 歌手 : 0.818265

歌手 & 男歌手 : 0.809164

歌手 & 創作型 : 0.807691

歌手 & 安室奈美惠 : 0.799534

歌手 & 男子音乐组合 : 0.799381

歌手 & 平井堅 : 0.792444

文言文 & 官話白話文 : 0.919003

文言文 & 文言文 : 0.908606

文言文 & 漢文 : 0.881737

文言文 & 文言 : 0.880541

文言文 & 漢文 : 0.859746

文言文 & 喃字 : 0.841082

文言文 & 喃字 : 0.839109

文言文 & 汉字 : 0.833915

文言文 & 书面语 : 0.831962

文言文 & 白話 : 0.826447

导师点评

对于word2vec效果的直观评估上,这位同学主要做了两件事。首先,打印了与某些词汇最相似的若干词汇出来,比如与“王力宏”最相似的词,主要都是一些歌手的名字,这也是比较make sense的。

其次,她做了可视化处理,在二维空间里直观地展示出词与词之间的相对位置关系。从图上也可以看到,乐器、歌手都相对集中地聚集到一些,显示它们在语义上的相似性。对于可视化来说,首先要做的处理是降维,不熟悉的同学,可以参考一下这个项目的做法。

这位同学还观察到一个点,通过word2vec模型,我们很容易找到在语义环境下比较“相似”的词对,但这不意味着它们之间是同义词,有时候也可能是反义词,像“加法”和“减法”,或者“文言文”与“官话白话文”。这是比较难处理的情况,后续还需要做些情感方面的分析。

手工模型实现

  • 导师点评最后,这位同学还利用pytorch自己对skipgram模型进行了实现。word2vec模型在网络结构上并不复杂,但能够自己实现一遍还是对于模型的理解非常有帮助的,也是我们非常鼓励的学习方式。现在做机器学习和深度神经网络,有非常多可用的模型和包,甚至是非常高层抽象的包,使用起来非常方便,有可能只用几行代码就可以实现一个功能。但是如果只是在这样层次,对于算法的理解会比较肤浅,在实际工作中如果遇到一些非常规情况的话,就很容易束手无策。当然,手工实现会比较花时间,而且也不太需要从最底层的功能开始实现起,我们的建议是在时间精力许可的情况下,尽量向下层走一点。

微信公众号微信公众号