如何将word2vec应用于k-means聚类?

时间:2016-09-28 16:52:31

标签: scala cluster-analysis text-mining word2vec dl4j

我是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对我的目标有意义吗?

提前致谢。

0 个答案:

没有答案