繁体   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