簡體   English   中英

如何在 Java 中實現 Word2Vec?

[英]How to implement Word2Vec in Java?

我在 Ubuntu 筆記本電腦上使用本教程安裝了 word2Vec。 為了在 Java 中實現 word2Vec 向量,是否完全有必要安裝DL4J 我很習慣在 Eclipse 中工作,但我不確定我是否需要 DL4J 希望我安裝的所有其他先決條件。

理想情況下,有一種非常簡單的方法可以讓我只使用我已經編寫的 Java 代碼(在 Eclipse 中)並更改幾行——這樣我正在做的單詞查找將檢索 word2Vec 向量而不是我正在使用的當前檢索過程。


另外,我已經考慮過使用 GloVe,但是,我沒有 MatLab。 是否可以在沒有 MatLab 的情況下使用 GloVe? (因此,我在安裝時遇到錯誤)。 如果是這樣,與上述相同的問題是......我不知道如何在 Java 中實現它。

是什么阻止您以文本格式保存 word2vec(C 程序)輸出,然后使用一段 Java 代碼讀取文件並將向量加載到由單詞字符串鍵控的哈希圖中?

一些代碼片段:

// Class to store a hashmap of wordvecs
public class WordVecs {

    HashMap<String, WordVec> wordvecmap;
    ....
    void loadFromTextFile() {
        String wordvecFile = prop.getProperty("wordvecs.vecfile");
        wordvecmap = new HashMap();
        try (FileReader fr = new FileReader(wordvecFile);
            BufferedReader br = new BufferedReader(fr)) {
            String line;

            while ((line = br.readLine()) != null) {
                WordVec wv = new WordVec(line);
                wordvecmap.put(wv.word, wv);
            }
        }
        catch (Exception ex) { ex.printStackTrace(); }        
    }
    ....
}

// class for each wordvec
public class WordVec implements Comparable<WordVec> {
    public WordVec(String line) {
        String[] tokens = line.split("\\s+");
        word = tokens[0];
        vec = new float[tokens.length-1];
        for (int i = 1; i < tokens.length; i++)
            vec[i-1] = Float.parseFloat(tokens[i]);
        norm = getNorm();
    }
    ....
}

如果要獲得給定單詞的最近鄰,可以保留與每個 WordVec 對象關聯的 N 個最近的預計算鄰的列表。

DL4j作者在這里。 我們的 word2vec 實現面向需要自定義管道的人。 我不怪你在這里走簡單的路線。

我們的 word2vec 實現是為了當你想用它們做一些事情而不是搞亂時。 c word2vec 格式非常簡單。

如果您願意,這里是 java 中的解析邏輯: https : //github.com/deeplearning4j/deeplearning4j/blob/374609b2672e97737b9eb3ba12ee62fab6cfee55/deeplearning4j-scaleout/deeplearning4j-nlp/orgingedembedmodels/java加載程序/WordVectorSerializer.java#L113

希望那有所幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM