我是word2vec的新手。应用这种方法,我试图根据word2vec从科学出版物的摘要中提取的单词形成一些聚类。为此,我首先通过stanfordNLP从摘要中检索句子,并将每个句子放入文本文件中的一行。然后,deeplearning4j word2vec所需的文本文件已准备好处理(http://deeplearning4j.org/word2vec)。
由于文本来自科学领域,因此有许多数学术语或括号。请参阅以下示例句子:
The meta-analysis showed statistically significant effects of pharmacopuncture compared to conventional treatment = 3.55 , P = .31 , I-2 = 16 % ) .
90 asymptomatic hypertensive subjects associated with LVH , DM , or RI were randomized to receive D&G herbal capsules 1 gm/day , 2 gm/day , or identical placebo capsules in double-blind and parallel fashion for 12 months .
准备好文本文件后,我运行了word2vec,如下所示:
SentenceIterator iter = new LineSentenceIterator(new File(".../filename.txt"));
iter.setPreProcessor(new SentencePreProcessor() {
@Override
public String preProcess(String sentence) {
//System.out.println(sentence.toLowerCase());
return sentence.toLowerCase();
}
});
// Split on white spaces in the line to get words
TokenizerFactory t = new DefaultTokenizerFactory();
t.setTokenPreProcessor(new CommonPreprocessor());
log.info("Building model....");
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();
log.info("Writing word vectors to text file....");
// Write word vectors
WordVectorSerializer.writeWordVectors(vec, "abs_terms.txt");
此脚本创建一个文本文件,其中包含许多单词及其相应的向量值,如下所示:
pills -4.559159278869629E-4 0.028691953048110008 0.023867368698120117 ...
tricuspidata -0.00431067543104291 -0.012515762820839882 0.0074045853689312935 ...
作为后续步骤,此文本文件已用于通过spark中的k-means形成一些集群。请参阅以下代码:
val rawData = sc.textFile("...abs_terms.txt")
val extractedFeatureVector = rawData.map(s => Vectors.dense(s.split(' ').slice(2,101).map(_.toDouble))).cache()
val numberOfClusters = 10
val numberOfInterations = 100
//We use KMeans object provided by MLLib to run
val modell = KMeans.train(extractedFeatureVector, numberOfClusters, numberOfInterations)
modell.clusterCenters.foreach(println)
//Get cluster index for each buyer Id
val AltCompByCluster = rawData.map {
row=>
(modell.predict(Vectors.dense(row.split(' ').slice(2,101)
.map(_.toDouble))),row.split(',').slice(0,1).head)
}
AltCompByCluster.foreach(println)
由于上面的最新scala代码,我根据word2vec建议的单词向量检索了10个集群。但是,当我检查我的星团时,没有出现明显的常用词。也就是说,我无法像我预期的那样得到合理的集群。基于我的这个瓶颈,我有几个问题:
1)从word2vec的一些教程中我看到没有进行数据清理。换句话说,介词等留在文本中。那么在应用word2vec时应该如何应用清洁程序?
2)如何以解释的方式可视化聚类结果?
3)我可以使用word2vec单词向量作为神经网络的输入吗?如果是这样哪种神经网络(卷积,递归,反复)方法会更适合我的目标?
4)word2vec对我的目标有意义吗?
提前致谢。