DustinChu Blog

Deeplearning4j(DL4J)使用Word2Vec 讓機器學習WIKI

word2vec 是基於非監督式學習,訓練集一定一定要越大越好,語料涵蓋的越全面,訓練出來的結果也會越漂亮,本篇所採用的是維基百科的備份,

取得資料

維基百科備份下載
我這邊下載的是 zhwiki-20171001-pages-meta-current.xml.bz2
解壓縮後zhwiki-20171001-pages-meta-current.xml

處理XML

我是使用Ruby來處理XMLGithub
使用 $ wp2txt --input-file zhwiki-20171001-pages-meta.xml 這樣會將wiki xml分割成許多的txt
像是這樣

如果你不想要訓練太多,想測試一下,可以將他分割的一部分給機器訓練就好了比較不會花太久時間訓練他
將分割的txt合併請輸入
$ cat zhwiki-20171001-pages-meta-* | grep -v '^\s*$' > zhwiki-corpus.txt
跑完後應該會像這樣

內容會是這樣

自然語言分詞

簡體要轉繁體 「不然数学」與「數學」會被 word2vec 當成兩個不同的詞
簡轉繁可以使用 OpenCC 這速度很快
分詞我這邊是使用HanLP
也可以使用 StanfordNlp
就看個人喜好與實作效率來決定使用哪一個就好了
分詞完資料像這樣

DL4J訓練 訓練完畢保存

這邊訓練的文件使用剛剛分割完的001其中一個Txt
目前使用CPU學習的話學習整個wiki 我的電腦要學習兩天

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
public class Word2VecCmd {
private static Logger log = LoggerFactory.getLogger(Word2VecRawTextExample.class);
public static void main(final String[] args) throws Exception {
log.info("Load data....");
SentenceIterator iter = new LineSentenceIterator(new File("D:\\wp2txt-master\\wiki\\001.txt"));
iter.setPreProcessor(new SentencePreProcessor() {
@Override
public String preProcess(String sentence) {
return sentence.toLowerCase();
}
});
TokenizerFactory t = new DefaultTokenizerFactory();
t.setTokenPreProcessor(new CommonPreprocessor());
log.info("Build model...");
int batchSize = 1000;
int iterations = 5;
int layerSize = 150;
Word2Vec vec = new Word2Vec.Builder()
.batchSize(batchSize)
.minWordFrequency(5)
.useAdaGrad(false)
.layerSize(layerSize)
.iterations(iterations)
.seed(7485)
.windowSize(5)
.learningRate(0.025)
.minLearningRate(1e-3)
.negativeSample(10)
.iterate(iter)
.tokenizerFactory(t)
.workers(6)
.build();
log.info("Fitting Word2Vec model....");
vec.fit();
WordVectorSerializer.writeWordVectors(vec, "pathToWriteto.txt");
log.info("Closest Words:");
Collection<String> lst = vec.wordsNearest("數學", 3);
System.out.println(lst);
double lst1 = vec.similarity("數學", "物理");
System.out.println(lst1);
log.info("Save.......");
WordVectorSerializer.writeWordVectors(vec, "D:\\wordvectors.txt");
}
}

輸出結果

訓練讀取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Word2VecPredictCmd {
public static void main (final String[] args) throws Exception {
WordVectors vec = WordVectorSerializer.loadTxtVectors(new File("D:\\wordvectors.txt"));
String[] names = {"數學"};
for(String name:names) {
System.out.println(name+">>>>>>");
Collection<String> lst = vec.wordsNearest(name, 5);
System.out.println(lst);
double lst1 = vec.similarity("數學", "物理");
System.out.println(lst1);
}
}
}

輸出結果

文章標題:Deeplearning4j(DL4J)使用Word2Vec 讓機器學習WIKI

文章作者:Dustinchu

發布時間:2017年11月01日 - 03:11

最後更新:2018年05月10日 - 21:05

原始連結:https://dustinchu.github.io/2017/11/01/Deeplearning4j-DL4J-使用Word2Vec-讓機器學習WIKI/

許可協議: 屬名-非商業性使用-禁止編譯 4.0 國際 轉載請保留原文連結及作者。

相關文章: