NLPchina / Word2VEC_java

word2vec java版本的一个实现
693 stars 486 forks source link

Word2VEC中的loadJavaModel中向量求模 #2

Closed siegfang closed 10 years ago

siegfang commented 10 years ago

你好!最近一直参看你的Java实现代码,帮助很大。但我在看从文件中加载模型的方法时发现了两个方法loadGoogleModelloadJavaModel,在loadJavaModel中需要对每个词的向量求模,并将其化为单位向量,但循环在每次开始计算模len之前没有重新置0,这样模len就会不断累加,变得越来越大line116

for (int i = 0; i < words; i++) {
    key = dis.readUTF();
    value = new float[size];
    for (int j = 0; j < size; j++) {
    vector = dis.readFloat();
        len += vector * vector;
        value[j] = vector;
    } 
    len = Math.sqrt(len);
    for (int j = 0; j < size; j++) {
        value[j] /= len;
    }
    wordMap.put(key, value);
}

这与loadGoogleModel中的相应方法不一样,故来问下这里是不是忘了在循环开始时对len置0?

ansjsun commented 10 years ago

谢谢你的提示。。貌似真的有问题:-)

for (int i = 0; i < words; i++) { double len = 0; key = dis.readUTF(); value = new float[size]; for (int j = 0; j < size; j++) { vector = dis.readFloat(); len += vector * vector; value[j] = vector; }

            len = Math.sqrt(len);

            for (int j = 0; j < size; j++) {
                value[j] /= len;
            }
            wordMap.put(key, value);
        }

应该是这样的。。不过每次log 导致值不会太大。所以没有造成很大的出入。结果也还靠谱。要不是你提醒恐怕我永远发现不了这个bug谢谢

siegfang commented 10 years ago

我先用小数据(2001条文本,共47673个词)进行了测试,观察到如果让len不断累加,每次输出的结果变化较小;如果len在每次循环之前置0,则每次输出的结果会有较大的不同。

buptdjd commented 10 years ago

小弟我刚刚接触DeepLearning,但是下载完工程后,运行出错,发现数据导入出错,能不能告诉我如何把数据导入到程序中,在程序的md文档中,只有测试程序,而没有完整的如何调试通过代码的步骤,您能百忙之中抽空把md文件补充一下吗?谢谢您。

siegfang commented 10 years ago

你可以看下我写的word2vec

ansjsun commented 10 years ago

但是两个java版本的word2vec ..有点不合适..如果你愿意是否假如nlpchina来维护java版本的word2vec呢>??