Zellig Harris さん (1954)
oculist
とeye-doctor
は,ほぼ同じ周囲語の中に出現」Firth さん (1957)
サイズは語彙数 | V | × | V | の疎行列となる |
of
, the
などは意味があんまないので無視したい2単語間PMI(w1, w2) = log₂{P(w1,w2)/P(w1)・P(w2)}
good
の同義語としてproficient
が登録ワンホットベクトル
単語ベクトル自身について,単語間の類似性をコード化するように学習したい
類似した文脈に出現する単語ベクトルが類似するように単語の密なベクトルを構築すること
Firth さん (1957)
ある単語 w の複数の文脈(context)を使用して,単語 w の表現を構築
wt
が与えられた際に文脈となる単語wt+j
が出現する確率 P を最大化するように,単語ベクトルを調整# 4.x.y cannot work with models for Kyubyong/wordvectors
import json
from typing import List, Tuple, TypedDict
from gensim.models import Word2Vec # gensim==3.8.3
# https://drive.google.com/open?id=0B0ZXk88koS2KVVNDS0lqdGNOSGM
class SimDict(TypedDict):
term: str
similarity: float
Sims = List[SimDict]
def get_synonyms(model: Word2Vec, input_word: str) -> Sims:
"""類似語の取得"""
results = [{'term': word, 'similarity': sim}
for word, sim in model.most_similar(input_word, topn=10)]
return results
def calc_similarity(model: Word2Vec, t1: str, t2: str) -> float:
"""類似度計算"""
return model.similarity(t1, t2)
def analogy(model: Word2Vec,
relpair_x_y: Tuple[str, str], input_x: str) -> Sims:
"""アナロジー計算"""
x, y = relpair_x_y
results = [{"term": word, "similarity": sim}
for word, sim in model.most_similar(positive=[y, input_x],
negative=[x], topn=10)]
return results
def main() -> None:
def p(d): return print(json.dumps(d, indent=4, ensure_ascii=False))
model = Word2Vec.load('./data/ja.bin')
syms = get_synonyms(model, 'アメリカ')
res = analogy(model, ('フランス', 'パリ'), '日本')
p(syms)
p(res)
if __name__ == '__main__':
main()