私はword2vecが初めてです。この方法を適用して、word2vec によって科学出版物のアブストラクトから抽出された単語に基づいて、いくつかのクラスターを形成しようとしています。この目的のために、まずスタンフォード NLP を介して抄録から文を取得し、各文をテキスト ファイルの行に入れました。これで、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 は私の目標にとって意味がありますか?
前もって感謝します。