自然言語処理(2)
1.分布式Representation(分布式表示)
単語自体をベクトル化する方法
分布仮定:「似たような擬似体に現れる語は似たような意味を持つ」
同義語周辺語の分布も似ている
①一-熱符号化:単語を簡単にベクトル化する方法
I am a student
I : [1 0 0 0] am : [0 1 0 0] a : [0 0 1 0] student : [0 0 0 1]
短所:単語間の類似度が求められない②埋め込み(Embedding)
単語は固定長のベクトルで、次元は一定のベクトルとして表されるので「imbedding」
ex) [0.04227, -0.0033, 0.1607, -0.0236, ...] れんぞくち
2. Word2Vec
単語をベクトルとして表す埋め込み方法
特定語の両方の語の関係を用いたため,分布仮定をよく反映した.
CboW / Skip-gram
入力
ex)10000単語の300次元埋め込みベクトルを取得する
入力層10000ビット、非表示層300ニューロン、出力層10000ニューロン
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に可視化
!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問題
スペルレベル埋め込み
モデルに学習されていない単語でも、割って見るだけで、フレーズに出てくる単語を類推することができます
※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
Reference
この問題について(自然言語処理(2)), 我々は、より多くの情報をここで見つけました https://velog.io/@ssulee0206/자연어-처리2テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol