stanfordnlp / GloVe

Software in C and data files for the popular GloVe model for distributed word representations, a.k.a. word vectors or embeddings
Apache License 2.0
6.86k stars 1.51k forks source link

the system gets confused on long or multiple vocabulary entries #70

Open kosloot opened 7 years ago

kosloot commented 7 years ago

In the code (cooccur.c and glove.c) there are some build-in tests for repeated entries in the vocabulary. Also long entries are detected. This however leads to very strange and questionable results. As an example I provide a toy vocabulary 'voc' and a toy text 'txt' voc.zip txt.zip

The commands I ran were: ./build/cooccur -window-size 3 -vocab-file voc < txt > bin ./build/shuffle -verbose 1 < bin > shuf ./build/glove -vocab-file voc -input-file shuf

The resulting vectors are wrong, imho: There are 3 different vectors for 'mies' and there are 2 vectors for parts of the overly long 'klaasklaas....' entry

aap 0.146921 -0.055305 -0.028311 -0.039464 0.074458 noot -0.085299 0.147773 0.035997 0.080978 -0.051187 mies -0.052002 0.054730 0.092953 0.116784 0.033464 mies -0.084152 0.107761 -0.010578 -0.007232 -0.115695 wim -0.036644 -0.050298 -0.034700 -0.142460 0.091654 klaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaaskl aasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaa sklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaask laasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaaskla asklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaas klaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaaskl aasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaa sklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaask laasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaaskla asklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaas klaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaas 0.068427 0. 033890 -0.031678 0.037881 -0.002418 klaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaaskl aasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaa sklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaasklaask laasklaasklaasklaasklaas 0.090010 0.112283 -0.010036 0.126007 -0.006739 zus -0.040267 0.141259 -0.006493 0.052686 0.058043 mies 0.001488 0.174758 -0.065266 -0.005968 -0.034094 <unk> 0.000942 0.074095 -0.006457 0.024357 0.005276

The problems are in cooccur.c, where the vocabulary is read,and the words are hashed.

SO: the vocabulary reading needs improvement. e.g. by skipping multiple and overly long entries totally. BUT THEN: This leads to a smaller vocabulary size then the files size. In glove.c the vocabulary size is first counted as the size of the file. Which would be wrong then, AND the vectors are written using words stemming from the same wrong reading loop as in cooccur.c. Otherwise things might get out-of-sync

So this needs rework. glove.c should use exact the same reading logic as cooccur.c

Storing the true vocabulary size in the .bin file might be a good idea?