예제 #1
0
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)
예제 #3
0
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()
예제 #5
0
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)