1 引言
自然语言处理的重大突破发生在大约2007年,以Google公司为代表的研究提出了一种以词矢量来表示语义相关的方法Word2Vec。建立在Word2Vec的基础之上,使用N-gram技术,可以构造出语义相关的词组,<语义相似模型(Doc2Vec)在双语教学中的应用>显示了这样的改进,这种改进对英语教学和双语教学具有非常重要的意义。当原始数据集比较“干净”,这种方法能够产生出很好的结果。不过,word2vec没有考虑词性的特征,于是Trask等人(2015)提出了sense2vec增强了词汇的语义表达与关联,通过引入词性,NER等特征来区分词汇之间的差别。大量的实践证明,sense2vec产生的结果比word2vec产生的结果好。本文讨论了构造sense2vec模型的过程。
2 sense2vec测试
sense2vec的最新版本是2.0.0,自带了两个预训练模型:s2v_reddit_2019_lg(4G)和s2v_reddit_2015_md(573M)。测试使用了前者的大模型。
(1) 查询natural language processing得出的结果:
machine_learning; NLP;
computer_vision; text_mining;
deep_learning;
Machine_Learning;
speech_recognition;
image_generation;
machine_learning_algorithms;
deep_reinforcement_learning
(2) 查询mining engineering得出的结果:
geological_engineering;
chemical_engineering;
minor_or_double_major;
engineering_geology;
BME_degree;
显然第二个试验的结果没有第一个试验的结果好,这是因为这个数据集中没有包含我们专业方面的话题,因此需要训练我们自己的数据集。
3 训练sense2vec模型
首先试验了一个5M的小数据集来训练,使用en_core_web_trf模型分词。命令行的操作非常诡异,因此把这个过程记录下来。
(1) 使用spaCy解析原始文本并输出Doc对象[01_parse.py];
python 01_parse.py set1.txt 01
其中set1.txt是原始文本文件名,01是产生Doc的目录, 产生出文件set1-1.spacy。
(2) 加载(1)产生的经过解析的Doc对象集 合,并以sense2vec格式输出文本文件(每行一个句子,合并具有意义的短语) [02_preprocess.py];
python 02_preprocess.py ./01/set1-1.spacy 02
其中./01/set1-1.spacy是(1) 产生的文件,02是输出文本的目录, 产生出文件set1-1.s2v。
(3) 使用FastText训练矢量[04_fasttext_train_vectors.py];
python 04_fasttext_train_vectors.py 04 ./02
其中./02是上一步骤产生的目录,作为本步骤的输入, 04是新产生的目录,产生出两个文件: vectors.txt和vocab.txt。
(4) 加载向量和频率,输出sense2vec分量,它通过Sense2Vec.from_disk加载[05_export.py]。
python 05_export.py ./04/vectors.txt ./04/vocab.txt out
其中out是新产生的目录,保存着最后产生出来的模型,如下图所示。
至此训练过程完成。步骤(1)最耗时,用了23分钟。训练结果如下:
(1) fracture的语义相似:
network; DFN; discrete;
aperture; hydraulic; length;
connectivity; fluid;
heterogeneous; voronoi;
(2) PFC3D的语义相似:
code; particle; Itasca;
BPM; PFC; assembly; PFC2D;
Pierce; UDEC; SJM; bonded;
Cundall; 3DEC
可能是数据量太小或者是数据不干净,本次试验没有产生出太多词组,doc.noun_chunks的作用没有显现出来,没有生成预期的结果。改用en_core_web_lg模型分词的效果相对较好:
(1) Discrete_Fracture_Network:
pathways; DFN;
BPM; algorithm; SRM
(2) Monte_Carlo:
reliability; probabilistic;
stochastic; simulation; DFN;
4 结束语
通过训练sense2vec可以构造出我们专业的词矢量。不过要得到最好的效果,需要高质量的大型数据集。