【问题标题】:How to implement Word2Vec in Java?如何在 Java 中实现 Word2Vec?
【发布时间】:2015-10-04 23:46:40
【问题描述】:

我在 Ubuntu 笔记本电脑上安装了 word2Vec using this tutorial。为了在 Java 中实现 word2Vec 向量,是否完全有必要安装 DL4J?我很喜欢在 Eclipse 中工作,但我不确定我是否需要 DL4J 想要我安装的所有其他先决条件。

理想情况下,我将有一种非常简单的方法,只需使用我已经编写的 Java 代码(在 Eclipse 中)并更改几行 - 这样我正在执行的单词查找将检索 word2Vec 向量而不是我正在使用的当前检索过程。


另外,我已经研究过使用 GloVe,但是,我没有 MatLab。是否可以在没有 MatLab 的情况下使用 GloVe? (因为这个,我在安装它时出错了)。如果是这样,与上面相同的问题......我不知道如何在Java中实现它。

【问题讨论】:

  • 其实我是在用 Java 构建一个小型 Glove 库,也许值得把它放到 GitHub 上。
  • @ThomasJungblut Git 上似乎有少量 word2vec/Glove 库,但我对它们了解不多...如果您决定上传,请告诉我更多信息!
  • 取决于你需要什么,它只是一个向量查找的单词还是你需要遍历?
  • @ThomasJungblut 目前,我想先尝试查找。扫描文件中的单词并为每个单词检索一个向量。
  • 你去吧:github.com/thomasjungblut/glove我会在接下来的几天里添加测试来强化它

标签: java machine-learning nlp artificial-intelligence word2vec


【解决方案1】:

是什么阻止您以文本格式保存 word2vec(C 程序)输出,然后用一段 Java 代码读取文件并将向量加载到以单词字符串为键的 hashmap 中?

一些代码sn-ps:

// 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 个最近的预计算邻居列表。

【讨论】:

    【解决方案2】:

    Dl4j 作者在这里。我们的 word2vec 实现面向需要自定义管道的人。我不怪你在这里走的简单路线。

    我们的 word2vec 实现是为了当你想用它们做某事时而不是为了搞乱。 c word2vec 格式非常简单。

    如果您愿意,这里是 java 中的解析逻辑: https://github.com/deeplearning4j/deeplearning4j/blob/374609b2672e97737b9eb3ba12ee62fab6cfee55/deeplearning4j-scaleout/deeplearning4j-nlp/src/main/java/org/deeplearning4j/models/embeddings/loader/WordVectorSerializer.java#L113

    希望对你有所帮助

    【讨论】:

    • 我试过DL4J,它太重了。你有只处理 w2vec 的更轻量级的版本吗?
    • 你能定义“太重”吗?抱歉,这是一个通用框架。从标记器到您输入数据的方式,一切都是可插入的。那是故意的。人们使用 dl4j 来解决实际问题。他们有特殊要求。只需包含几个依赖项。 deeplearning4j-nlp 和 nd4j-native-platform。剩下的就交给你了。如果您更具体但“太重”对任何形式的批评都没有用处,我会有所帮助。
    猜你喜欢
    • 2017-03-07
    • 2020-03-19
    • 2018-12-04
    • 2016-11-01
    • 2017-07-29
    • 2020-03-05
    • 2011-05-13
    • 1970-01-01
    • 2016-09-02
    相关资源
    最近更新 更多