word representation


Word Representationは
自然言語を有意義な形で表現し、機械学習や深い学習によって分析する.
  • 自然言語?
    自然言語とは、昔から自然に使われてきた言語のこと.
    例えば、韓国語や日本語の英語や言語です.
  • 意味のある形?


    自然言語を勝手に表現すれば、有意義な分析は難しい.
    古来、自然言語を有意義な形に表現するために、様々な方法が用いられてきた.
    最初は簡単に文の中でどのように単語を表現しますか?そんな苦悩が始まる
    その結果,One-hot VectorとCountの表現に基づいた.

  • One-hot Vector
    円熱ベクトルは、指向量のうち1つの要素だけが1である.
    このホットベクトルを使用して単語を表す方法は、各単語に一意のインデックスを与えることです.
  •   
      word_list = [ "오늘", "날씨가", "좋다" ]
      one_hot_word = []
      #1
      for i in range(len(word_list)):
      	one_hot=[0] * len(word_list)
        	one_hot[i] = 1
            one_hot_word.append(one_hot)
            
      #2
      import numpy as np
      
      one_hot_word = np.eye(len(word_list), dtype=int32)
        

  • Bag of Words (BoW)
    Bowは単語ポケット
    「昨日は曇りで、今日は天気がよかった」という言葉が出たとき(語切単位分析)、
    きのう
    天気
    曇り空
    今日
    はい.
    bag of wordは、上記のように単語の頻度を表すことができます.
    「昨日は曇りで、今日は天気がよかった」という言葉は[1,2,1,1,1,1]で表すことができます.
  • import re
    
    source = "어제 날씨가 흐렸는데, 오늘 날씨가 좋다"
    #컴마 삭제
    source = re.sub(",","",source)
    source = re.split(" ",source)
    print(source)
    
    dic = {}
    Bow = []
    for word in source:
        if word not in dic:
            dic[word] = len(dic)
            Bow.insert(len(dic)-1,1)
            
        else:
            index = dic[word]
            Bow[index] += 1  
            
    print(dic)
    print(Bow)

    Bowの表現方法は、2つ以上の文またはドキュメントを表し、それらの間の類似度を求めるために使用される.
    import re
    
    source1 = "어제 날씨가 흐렸는데, 오늘 날씨가 좋다"
    source2 = "좋다 오늘 날씨가, 흐렸는데 어제 날씨가"
    
    sources = [source1, source2]
    
    
    dic = {}
    Bow = []
    for source in sources:
        #컴마 삭제
        source = re.sub(",","",source)
        source = re.split(" ",source)
        
        tmp_Bow = [0]*len(set(source))
        
        for word in source:
            if word not in dic:
                dic[word] = len(dic)
                tmp_Bow[dic[word]] += 1
                
            
            else:
                index = dic[word]
                tmp_Bow[index] += 1  
        Bow.append(tmp_Bow)
            
    print(dic)
    print(Bow)
    
    result = sum([ a*b for a,b in zip(*Bow)])
    print(result)

    結果を見ると、Bowは単語の頻度で文を表すだけなので、その単語がどのような順序で構成されているかはまったく考慮されません.したがって,両文の意味が全く異なっていても,似たような単語が多く出てくると,類似性の高い文を判断する欠点がある.
    類似性は、Bowで表されるドキュメント間の要素に乗じたすべての値を使用します.
    import re
    
    source1 = "나는 파인애플 피자가 좋아"
    source2 = "나는 파인애플 파인애플 음료수가 좋아"
    source3 = "나는 피자가 좋아"
    
    sources = [source1, source2, source3]
    
    N = len(source2.split())
    dic = {}
    Bow = []
    for source in sources:
        #컴마 삭제
        source = re.sub(",","",source)
        source = re.split(" ",source)
        
        tmp_Bow = [0]*N
            
        for word in source:
            if word not in dic:
                dic[word] = len(dic)
                tmp_Bow[dic[word]] += 1
                
            
            else:
                index = dic[word]
                tmp_Bow[index] += 1  
        Bow.append(tmp_Bow)
            
    print(dic)
    print(Bow)
    
    result = 0
    for i in range(len(Bow)):
        for j in range(i+1,len(Bow)):
            
            a=sum([a*b for a,b in zip(Bow[i],Bow[j])])
            print(f"{sources[i]} -- {sources[j]}의 유사도 : {a}")

    文の意味ではピザと飲み物は全く関係ありませんが、パイナップルの頻度が高いので、文の類似度も高い間違いがあります.また,文の重要な要素である単語の順序も無視される.最後の欠点は、総単語数が大きいほど、各文の効率が低下することです.各文は総単語数を表すからです.

  • TF - IDF ( Term Frequency Inverse Document Frequency)
    TF:Boowと同じ概念で単語を表す頻度.
    DF:特定の単語がドキュメントに表示される頻度(特定のドキュメントに多くの単語がある場合でも、1つで測定できます)
    上記の例ではパイナップルのDFは2であり,source 2にパイナップルが2回出現しても頻度は1である.
    IDF:DF値に逆数を表す値.

    IDFは,ある語が複数の文書に頻繁に出現すると,その語の重要性が低いことを意味する.上のパイナップルが複数の文章に登場すれば、その重要性を下げることを意味します.
    logがない場合、DF値が小さいほどIDF値が大きくなるため、重み付け差を減らすために使用されます.
  • from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
    
    source1 = "나는 파인애플 피자가 좋아"
    source2 = "나는 파인애플 파인애플 음료수가 좋아"
    source3 = "나는 피자가 좋아"
    
    DOCS = [source1, source2, source3]
    
    print("=============Bow=================")
    vector = CountVectorizer()
    print(vector.fit_transform(DOCS).toarray())
    print("=============TF-IDF=================")
    
    tfidfv = TfidfVectorizer().fit(DOCS)
    print(tfidfv.transform(DOCS).toarray())
    print(tfidfv.vocabulary_)
    

    これらの表現方法の欠点は,最終的には文の順序を考慮せず,単語数の増加に伴って表現を必要とするベクトルの次元数もそれに応じて増加することである.この問題を解決するために,単語を分散として表す方法がいくつか出現し始めた.

  • 語の分散表現
    語義は周囲の単語が形成する分布仮定に基づいて表現される.
    i guzzle beer
    i drink wine
    guzzleとdriveは前後のコンテキスト単語(contextword)から似たような意味を持っていることがわかる.
    このように、パイナップルピザが好きなら、私の好きな文を分散して表現します.
    私はパイナップルピザが好きです.0100パイナップル1010ピザが好きです.0101は0010が好きです.
    上の図に示すように、両側に1つずつある単語をマトリクス形式で表すことができ、同時マトリクスと呼ばれます.
    コンカレントマトリクスの問題は韓国語の「-隠,-隠...」です.英語では「a,the...」これらの規範化されていない用語は、理解の問題を引き起こす可能性があります.
    drive the car
    wash the car
    drive the car
  • 上記の例に示すように、最終的にcar---driveとの関連性はより高いはずですが、前の「the」はより多くなる可能性があるので、その意味を理解するのは難しいです.
    この問題を解決する方法は,点式多点情報(PMI)である.


    例えば、「the」および「car」および「drive」は1000回、20回、10回出現する.
    「和」「car」が同時に発生した回数を10回とし、「car」と「drive」が同時に発生した回数を5回とする.

    したがって、PMI(「car」、「car」)の値がPMI(「car」、「drive」)よりも大きいことがわかります.
    このPMIが直ちに適用される場合、同時回数が0の場合、PMI値は負の値の無限大を表す.

    PPMIを適用すると常に正の値が使用されます.
    PPMIを適用して同時行列を表すことができる.
    「私はパイナップルピザが好きです.あなたもパイナップルピザが好きです.」
    私はパイナップルピザが好きです.あなたも好きです.010000パイナップル1020100ピザが好きです.
    PPMI

    上記PPMI行列が得られると、「ピザ」と「良い」との相関がより高いと判断できる.
    ただし、上記のマトリクスを表示すると、ほとんどの要素がゼロであることがわかります.
    この形式の行列を疎行列(疎行列)と呼ぶ.
    これはベクトルのほとんどの情報が重要ではないことを意味し,この問題を解決するために,
    次元を収縮させることで、密ベクトル(稠密マトリクス)として表すことができます.
    「特殊値分解」(SVD)を使用して、次元を減らします.
    特異値分解は任意m×nm\times nm×n行列AAAの分解方法は以下の通りである.
    X=USVTX = USV^TX=USVT
    UとVは直交行列であり、その列ベクトルは互いに直交する
    Sは対角行列(対角成分を除いてゼロの行列)
    U行列は「単語空間」と見なすことができ、Sは対角行列であり、その対角成分は「特異値」の大きい順にリストされる.これらの値は重要な値と見なされます.

    この方法では、疎ベクトルを密ベクトルに変換できます.
  • 語の推論表現
  • 推論に基づいて単語を表現する方法は,現在深さ学習で広く用いられている方法である.
    推論の基礎は,所与の脈絡において,その位置にどの単語が含まれるべきかを推測することである.

    上記の方法は,入力単語のソース熱ベクトル値と重み付けWinW{in}Winに行列を乗じた結果をWoutW{out}Woutに行列の値を乗じ,どの単語が出現すべきかを推定することである.
    ここで,単語表現として用いられる部分はWinW{in}Winであり,学習を継続し学習を完了するWinW{in}Winベクトルを用いて正解を探す.

    現在では単語の推論表現が広く用いられているが,最近では単語を学習するために有効な方法やパターンが多様化しているため,詳細は単独で学習する必要がある.