3

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

提前致谢。

4

0 回答 0