def test_count_method_big(): """PTBコーパスデータセットに対して、 共起行列、正の相互情報量行列、SVDによる次元削減を行う. SVDによる次元削減はO(N^3)なので、高速なscikit-learn版を使う. """ window_size = 2 wordvec_size = 100 corpus, word_to_id, id_to_word = ptb.load_data('train') vocab_size = len(word_to_id) print('counting co-occurence...') C = create_co_matrix(corpus, vocab_size, window_size) print('calculating PPMI...') W = ppmi(C, verbose=True) print('calcurating SVD ...') try: # truncated SVD (fast!) from sklearn.utils.extmath import randomized_svd U, S, V = randomized_svd(W, n_components=wordvec_size, n_iter=5, random_state=None) except ImportError: # SVD (slow) U, S, V = np.linalg.svd(W) word_vecs = U[:, :wordvec_size] querys = ['you', 'year' 'car', 'toyota'] for query in querys: most_similar(query, word_to_id, id_to_word, word_vecs, top=5)
def test_most_similar(): """クエリ単語に対する類似度のランキングを表示 """ text = 'You say goodbye and I say hello.' corpus, word_to_id, id_to_word = preprocess(text) vocab_size = len(word_to_id) C = create_co_matrix(corpus, vocab_size) most_similar('you', word_to_id, id_to_word, C, top=5)
def test_similarity(): """コサイン類似度の計算 """ text = 'You say goodbye and I say hello.' corpus, word_to_id, id_to_word = preprocess(text) print(f"corpus: {corpus}") print(f"word_to_id: {word_to_id}") print(f"id_to_word: {id_to_word}") vocab_size = len(word_to_id) C = create_co_matrix(corpus, vocab_size) c0 = C[word_to_id['you']] # `you`の単語ベクトル c1 = C[word_to_id['i']] # `i`の単語ベクトル print(f"cos_similarity: {cos_similarity(c0, c1)}")
def test_count_method_small(): """特異値分解(SVD)によるPPMI(正の相互情報量行列)の次元削減 """ text = 'You say goodbye and I say hello.' print(text) corpus, word_to_id, id_to_word = preprocess(text) print(f"corpus: {corpus}") print(f"word_to_id: {word_to_id}") print(f"id_to_word: {id_to_word}") vocab_size = len(word_to_id) C = create_co_matrix(corpus, vocab_size) # 正の相互情報量 W = ppmi(C) np.set_printoptions(precision=3) print("covariance matrix") print(C) print('-'*50) print("PPMI") print(W) # SVD U, S, V = np.linalg.svd(W) # Note@ SVDは行列サイズNに対して、計算時間がO(N^3)とかなり遅いため、通常は、truncated SVD(scikit-learn)を使う # UがSVDによって変換された密な単語ベクトル(行列) print(f"C[0]: {C[0]}") print(f"W[0]: {W[0]}") print(f"U[0]: {U[0]}") print(f"U[0, :2]: {U[0, :2]}") # 次元削減したベクトルを2次元散布図としてプロット for word, word_id in word_to_id.items(): plt.annotate(word, (U[word_id, 0], U[word_id, 1])) plt.scatter(U[:, 0], U[:, 1], alpha=0.5) plt.show()
def test_ppmi(): """正の相互情報量を値とする共起行列を計算 """ text = 'You say goodbye and I say hello.' print(text) corpus, word_to_id, id_to_word = preprocess(text) print(f"corpus: {corpus}") print(f"word_to_id: {word_to_id}") print(f"id_to_word: {id_to_word}") vocab_size = len(word_to_id) C = create_co_matrix(corpus, vocab_size) # 正の相互情報量 W = ppmi(C) np.set_printoptions(precision=3) print("covariance matrix") print(C) print('-' * 50) print("PPMI") print(W)