自然言語処理(2)


1.分布式Representation(分布式表示)


単語自体をベクトル化する方法
分布仮定:「似たような擬似体に現れる語は似たような意味を持つ」
同義語周辺語の分布も似ている
  • Word d 2 Vec,fastTextはその単語の周囲の単語によってベクトルで表す対象単語が
  • であることを決定する.
  • 単語ベクトルをこのように定義するのは、分布仮定:
  • ①一-熱符号化:単語を簡単にベクトル化する方法

    I am a student
    I : [1 0 0 0]   am : [0 1 0 0]   a : [0 0 1 0]   student : [0 0 0 1]
    短所:単語間の類似度が求められない
  • 個の単語間の類似度を求めるには、コサイン類似度(cosine類似度)
  • を用いる.
  • 元の熱符号化された2つのベクトルの内積は常に0であり、余弦類似度を求めても0(したがって2つの語の関係は全く知らない)
  • である.

    ②埋め込み(Embedding)


    単語は固定長のベクトルで、次元は一定のベクトルとして表されるので「imbedding」
    ex) [0.04227, -0.0033, 0.1607, -0.0236, ...] れんぞくち

    2. Word2Vec


    単語をベクトルとして表す埋め込み方法
    特定語の両方の語の関係を用いたため,分布仮定をよく反映した.

    CboW / Skip-gram

  • 連続コンテンツワールド(CBoW):
  • モデルは,周囲の単語の情報から中心語の情報を予測する.
  • Skip-gram:中心語の情報に基づいて周囲語の情報を予測するモデル(Skip-gramの性能はやや良い)
  • Word d 2 Vec(図をスキップ)モデルの構造
    入力
  • :Word 2 Vecの入力は、熱符号化された単語ベクトル
  • である.
  • 非表示レイヤ:ノードを含む非表示レイヤ(imbeddingベクトルの次元数)のニューラルネットワーク
  • 出力レイヤ:複数の単語からなるノードで、ソフトMaxをアクティブ化関数として使用

    ex)10000単語の300次元埋め込みベクトルを取得する
    入力層10000ビット、非表示層300ニューロン、出力層10000ニューロン
  • Word d d 2 Vec学習データ設計
    Windowsサイズが2のWord 2 Vecなので、中心語の隣にある2つの語に対して、単語ペアは
  • となります.
    ex) "The tortoise jumped into the lake"
    중심단어 The, 주변 문맥 단어 tortoise, jumped
    학습 샘플 :  (the, tortoise), (the, jumped)
    중심 단어 : jumped / 주변 문맥 단어 : the, tortoise, into, the
    학습 샘플: (jumped, the), (jumped, tortoise), (jumped, into), (jumped, the)

    埋め込みベクトルをWord d 2 Vecに可視化


  • Word 2 Vecで得られたimbeddingベクトルは単語間の意味と文法関係
  • を良く表す.
  • 欠点:Word 2 Vecはブロックに現れない単語をベクトル化できない
  • !pip install gensim --upgrade
    import gensim
    
    gensim.__version__  →  4.0.1 확인
    
    # 구글 뉴스 말뭉치
    import gensim.downloader as api
    wv = api.load('word2vec-google-news-300')
    
    # 단어간 유사도 파악 genism패키지의 .similarity이용
    pairs = [
        ('car', 'minivan'),   
        ('car', 'bicycle'),  
        ('car', 'airplane'),
        ('car', 'cereal'),    
        ('car', 'democracy')
    ]
    
    for w1, w2 in pairs:
        print(f'{w1} ====== {w2}\t  {wv.similarity(w1, w2):.2f}')
    
    → car ====== minivan	  0.69
      car ====== bicycle	  0.54
      car ====== airplane	  0.42
      car ====== cereal	  0.14
      car ====== democracy	  0.08   출력
    
    # .most_similar 메서드 / .doesnt_match메서드도 있다

    3. fastText


    スペルベースの埋め込み方式をWordバージョンに追加する新しい埋め込み方式.

    OOV問題

  • にはすべての単語のフレーズが含まれていないため、Word 2 Vecの欠点は、フレーズに表示されていない単語に対してimbeddingベクトルを作成できないことです.
  • 既存語には出現しない語に出現する問題をOOV問題
  • と呼ぶ.
  • は、出現の少ない単語については学習が少ないため、適切な埋め込みベクトルを生成できないのも欠点
  • である.
  • fastTextのない単語でもかなりの精度で2つの単語のimbeddingベクトルを求めることができ、類似度
  • を表す.

    スペルレベル埋め込み


    モデルに学習されていない単語でも、割って見るだけで、フレーズに出てくる単語を類推することができます
    ※fastTextでCharacter-level(スペル単位)を使う方法:Charactern-gram
    fastTextは文字情報(3-6 grams)単位を使用し、3-6文字からなる
    単語を3~6単位に組み合わせる前に、モデルが接頭辞と接尾辞を認識できるように、その単語の前後に<,>を付けてから、その単語を3~6文字-levelに切り取り、imbedingを適用します.
    ex) <eating> 
    3grams → <ea eat ati tin ing ng>
    4grams → <eat eati atin ting ing>
    # 이런식으로 6grams까지 해서 벡터를 생성하고
    # 18개의 character-level n-gram을 얻을 수 있다
  • スペル単位リンベディンの適用
    eatingという語が1つのフレーズ内にある場合、skip-gramから学習したimbeddingベクトルに、上から得られた18文字-level n-gramのベクトルを加算する
    beingという語がフレーズ内にない場合、18文字-level n-gramのベクトルからなる
  • from pprint import pprint as print
    from gensim.models.fasttext import FastText
    from gensim.test.utils import datapath
    
    corpus_file = datapath('lee_background.cor')
    
    model = FastText(vector_size=100)
    
    model.build_vocab(corpus_file=corpus_file)
    
    model.train(
        corpus_file=corpus_file, epochs=model.epochs,
        total_examples=model.corpus_count, total_words=model.corpus_total_words,
    )
    
    ft = model.wv
    # 말뭉치에 있는지 없는지 확인 
    print('night' in ft.key_to_index)    →  True
    print('nights' in ft.key_to_index)   →  False
    
    # 두 단어의 유사도 파악
    print(ft.similarity("night", "nights"))  →  0.9999918