分词是进行文本挖掘后续处理步骤的基础,中文分词主要有三种方法:
词典分词
理解分词
统计分词
分词的软件
Word2vec是一个用于处理文本的双层神经网络。它的输入是文本语料,输出则是一组向量:该语料中词语的特征向量。虽然Word2vec并不是深度神经网络,但它可以将文本转换为深度神经网络能够理解的数值形式。
Word2vec指一类彼此相关的算法,而以下是采用Skip-Gram负样本采样模型的实现方法。用于自然语言处理的模型还包括CBOW(Continuous Bag-of-Word),文章详情。
SentenceIterator iter = new LineSentenceIterator(new File("/home/wangyang/workspace/ncbi-genome-download/raw_sentences.txt")); iter.setPreProcessor(new SentencePreProcessor() { @Override public String preProcess(String sentence) { return sentence.toLowerCase(); } }); // 数据分词 // 在每行中按空格分词 TokenizerFactory t = new DefaultTokenizerFactory(); t.setTokenPreProcessor(new CommonPreprocessor()); log.info("Building model...."); /** * batchSize是每次处理的词的数量。 * minWordFrequency是一个词在语料中必须出现的最少次数。本例中出现不到五次的词都不予学习。词语必须在多种上下文中出现,才能让模型学习到有用的特征。对于规模很大的语料库,理应提高出现次数的下限。 * useAdaGrad-AdaGrad为每个特征生成一个不同的梯度。在此处不需要考虑。 * layerSize指定词向量中的特征数量,与特征空间的维度数量相等。以500个特征值表示的词会成为一个500维空间中的点。 * iterations是网络在处理一批数据时允许更新系数的次数。迭代次数太少,网络可能来不及学习所有能学到的信息;迭代次数太多则会导致网络定型时间变长。 * learningRate是每一次更新系数并调整词在特征空间中的位置时的步幅。 * minLearningRate是学习速率的下限。学习速率会随着定型词数的减少而衰减。如果学习速率下降过多,网络学习将会缺乏效率。这会使系数不断变化。 * iterate告知网络当前定型的是哪一批数据集。 * tokenizer将当前一批的词输入网络。 * vec.fit()让已配置好的网络开始定型。 * */ Word2Vec vec = new Word2Vec.Builder() .minWordFrequency(5) .iterations(1) .layerSize(100) .seed(42) .windowSize(5) .iterate(iter) .tokenizerFactory(t) .build(); log.info("Fitting Word2Vec model...."); vec.fit(); // 下一步是评估特征向量的质量 // 编写词向量 WordVectorSerializer.writeWordVectors(vec, "pathToWriteto.txt"); log.info("Closest Words:"); Collection<String> lst = vec.wordsNearest("day", 10); System.out.println(lst);
自己训练词向量需要大量的时间和计算资源,因此可以使用谷歌新闻语料模型来作为词向量模型。百度网盘链接
File gModel = new File("/home/wangyang/workspace/ncbi-genome-download/GoogleNews-vectors-negative300.bin.gz"); Word2Vec vec = WordVectorSerializer.readWord2VecModel(gModel); Collection<String> lst = vec.wordsNearest("day", 10); System.out.println(lst); Collection<String> kingList = vec.wordsNearest(Arrays.asList("king", "woman"), Arrays.asList("queen"), 10); System.out.println(kingList);
Word2vec最经典的词语算式例子是“king - queen = man - woman”(国王 - 王后 = 男人 - 女人),可由此推出“king - queen + woman = man”(国王 - 王后 + 女人 = 男人)。上述示例会输出距离king - queen + woman这一向量最近的10个词,其中应当包括 man。wordsNearest的第一个参数必须包括king和woman这两个“正的”词,它们都带有加号;第二个参数则包括queen这个“负的”词,带有减号(此处的正负不代表任何潜在的感情色彩);第三个参数是词表的长度,即你希望得到多少个最接近的词。
[week, days, morning, month, hours, afternoon, hour, weekend, evening, time] [man, boy, teenage_girl, girl, teenager, motorcyclist, Sabbar_Kashur, Gunshot_victim, motorcylist, Manious]