展开

分词

最后发布时间 : 2023-10-27 13:49:31 浏览量 :

分词是进行文本挖掘后续处理步骤的基础,中文分词主要有三种方法:

  • 词典分词:将待分词文本中的字符串与词典的词语进行字符串匹配
  • 理解分词:在分词的同时考虑到句法以及语义信息
  • 统计分词:在语料库中出现的统计频率来判断是否构成词语,常用的统计量有词频、互信息
    • N 元文法统计模型(N-gram Model)
    • 隐马尔科夫模型(Hidden Markov Model)
    • 最大熵模型 ( Maximum Entropy Model)

分词的软件

  • Stanford Segmenter
  • ICTCLAS 系统
  • 结巴分词

生信小木屋

Word2Vec简介

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);

导入Word2vec模型

自己训练词向量需要大量的时间和计算资源,因此可以使用谷歌新闻语料模型来作为词向量模型。百度网盘链接

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]