我是 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 对我的目标有意义吗?
提前致谢。