| 153 | json.dump(word2idx, f) |
| 154 | |
| 155 | def find_analogies(w1, w2, w3, we_file='word_embeddings.npy', w2i_file='wikipedia_word2idx.json'): |
| 156 | We = np.load(we_file) |
| 157 | with open(w2i_file) as f: |
| 158 | word2idx = json.load(f) |
| 159 | |
| 160 | king = We[word2idx[w1]] |
| 161 | man = We[word2idx[w2]] |
| 162 | woman = We[word2idx[w3]] |
| 163 | v0 = king - man + woman |
| 164 | |
| 165 | def dist1(a, b): |
| 166 | return np.linalg.norm(a - b) |
| 167 | def dist2(a, b): |
| 168 | return 1 - a.dot(b) / (np.linalg.norm(a) * np.linalg.norm(b)) |
| 169 | |
| 170 | for dist, name in [(dist1, 'Euclidean'), (dist2, 'cosine')]: |
| 171 | min_dist = float('inf') |
| 172 | best_word = '' |
| 173 | for word, idx in iteritems(word2idx): |
| 174 | if word not in (w1, w2, w3): |
| 175 | v1 = We[idx] |
| 176 | d = dist(v0, v1) |
| 177 | if d < min_dist: |
| 178 | min_dist = d |
| 179 | best_word = word |
| 180 | print("closest match by", name, "distance:", best_word) |
| 181 | print(w1, "-", w2, "=", best_word, "-", w3) |
| 182 | |
| 183 | if __name__ == '__main__': |
| 184 | we = 'lstm_word_embeddings2.npy' |