「コンテキストの解読:NLPにおける単語ベクトル化技術」
Decoding Context Word Vectorization Techniques in NLP
あなたは自国から遠く離れた新しい町に引っ越しました。そこでカフェで誰かにばったり出会いました。あなたと同じ年齢の若い女性で、すぐに会話に入りました。それはお互いが英語を知っていたから起こったことです。あなたの言語を話す誰かに出会えたことに興奮していたとき、ウェイターが現地の言葉で注文を取りに来ました。まあ、新しい友達は翻訳者になる準備ができています。アパートに戻った直後、あなたはインターネットを駆使して、現地の言語を学ぶためのコースを探しました。したがって、2つの実体間の適切なコミュニケーションには共通の言語が不可欠であることが明白です。
人工知能の活発な領域である自然言語処理は、興味深い技術です。機械があなたの母国語で話していることを理解できるのは魅力的です。これにより、人間とコンピュータの間でスムーズな相互作用が可能になります。ただし、それが実現するには共通のコミュニケーション言語が必要ではないでしょうか?人間は英語、スペイン語、フランス語、ヒンディー語、中国語など、さまざまな言語を話しますが、コンピュータが知っている唯一の言語はバイナリです。彼らの世界は0と1で構成されています。
コンピュータが数値を理解し、私たちが英語などの言語を理解できるのであれば、自然言語を数値に変換するものがあるはずです。それがWord2vecです。
- 「ROUGEメトリクス:大規模言語モデルにおける要約の評価」
- プラグ可能な回折ニューラルネットワーク(P-DNN):内部プラグインを切り替えることによって、様々なタスクを認識するために適用できるカスケードメタサーフェスを利用する一般的なパラダイム
- 「RAVENに会ってください:ATLASの制限に対処する検索強化型エンコーダーデコーダーランゲージモデル」
Word2vecは文章中の単語を連続した空間内のベクトルとして表現します。ベクトルはさまざまな文脈で単語間の意味的な関係を捉えます。類似した単語は類似したベクトルを持ちます。以下の図は、そのようなベクトル空間の2次元表現を示しています(実際のNLP問題では、ベクトル空間の次元は2よりもはるかに高いです)。
歩くと走るのような類似した単語が近くにあることがわかります。一方、smileとRadiologyは関連のない単語であり、遠く離れています。お互いに近い単語は置き換え可能な単語と呼ばれます。つまり、これらの単語を文の中で入れ替えても、文はまだ意味をなします。2つの単語の置換可能性は、2つの単語のベクトル間の角度の余弦に基づいて計算することができます。これは-1から1の値を取り、1は単語が強く関連していることを意味します。ベクトル上でいくつかの操作を行うことで、類似の単語を見つけるなどのタスクを実行することができます。
Word2vecは主に単語の予測に使用されます。私たちは電子メールなどの日常的に使用されるアプリで自動補完や自動修正のような機能を見たことがあるかもしれません。Word2vecは、不完全なドキュメント内の次の単語/単語を予測するために主に使用されます。これらのタスクを実行するためには、機械学習モデルをトレーニングする必要があります。
現実のアプリケーションで自然言語がベクトル化されるいくつかの方法を見てみましょう。
ここでは、比較的小さなデータセットを使用してスパムフィルタリングモデルをトレーニングします。適切なモデルを作成するには、より大きなデータセットを使用する必要があります。それには時間がかかります。
データには、スパムメッセージまたはそうでないテキストメッセージが含まれています。ここからダウンロードできます。
それはテキストファイルであり、各行には、ラベルとカンマで区切られた文が2つのフィールドがあります。スパムメッセージの場合はラベルがスパムであり、本物のメッセージの場合はハムです。
これをPythonで実装します。プログラムには、numpy、pandas、nltk、regex、gensimなど、さまざまなライブラリが必要です。インストールされていない場合は、pipを使用してインストールできます。プログラムにインポートされたすべてのパッケージを示します。
from gensim.models import Word2Vecimport numpy as npfrom nltk.corpus import stopwordsimport nltkfrom nltk.corpus import stopwordsimport pandas as pdimport stringimport regex as refrom sklearn.feature_extraction.text import TfidfVectorizerfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.metrics import precision_score,recall_scorefrom sklearn.model_selection import train_test_splitimport gensim
全てのパッケージをインポートしたので、実装を始めることができます。
最初のステップは、データセットをクリーンにし、準備することです。
messages = pd.read_csv("output.csv", delimiter="\t")messages.columns = ["label", "text"] def text_cleaner(text): nxt = "".join([char for char in text if char not in string.punctuation]) nxt = re.split("\W+",nxt.lower()) nxt = [k for k in nxt if k not in stopwords.words('english')] return nxt messages["clean_text"] = messages['text'].apply(lambda x:text_cleaner(x))print(messages.head())
データセットをoutput.csvというファイルに保存しました。ファイルを読み込むためにpandas.read_csv()を使用しました。デリミタは”\t”に設定されています。
データには、”label”と”text”という2つの列にタイトルを付けました。
テキストをトークンに変換する必要があります。その前に、テキストをクリーンにすることができます。まず、文中の全ての句読点を削除しました。Pythonでは、一般的な句読点はstring.punctuationで見つけることができます。
nxt = re.split(“\W+”,nxt.lower())は、正規表現を使用して文を単語のセットに分割するために使用されます。また、単語を小文字に変換しました。なぜなら、モデルが大文字と小文字を区別しないようにしたいからです。
ストップワードとは、文の要点にほとんど貢献しない単語のことです。英語には約170以上のストップワードがあります。nltkライブラリのstopwords.words(‘english’)を使って、これらの単語をデータから削除することができます。
データは今クリーンになり、トークン化され、clean_textという新しい列に保存されています。データの最初の5つのエントリはhead()関数を使用してプリントすることができます。
トークンのセットができたので、トレーニングする前にベクトルに変換する必要があります。そのために、TF-IDF(Term Frequency Inverse Document Frequency)という特性を使用しましょう。文書内の単語のTF-IDFは、その単語が文書にとってどれだけ重要かを示します。これは、文書内の単語の頻度に直接関連し、サンプル空間内の文書の数に反比例します。以下の式で計算することができます:
Pythonでは、TfidfVectorizerクラスを使用してベクトルを作成することができます。コードをシンプルにするために、クリーニングとトークン化のための新しい列を作成していません。text_cleaner関数は、TfidVectorizer()で呼び出すことができます。
new_vector = TfidfVectorizer(analyzer=text_cleaner)x = new_vector.fit_transform(messages['text'])x_features = pd.DataFrame(x.toarray())
xは、各行がサンプル空間内のすべてのトークンのTF-IDF値を含むベクトルを表す2次元配列です。単語が文に存在しない場合、そのトークンのTF-IDF値はゼロになります。ほとんどの単語についてこれが当てはまるため、私たちは疎行列を得ました。疎行列は、トレーニングのためにpandasのデータフレームに変換されます。
ここで、モデルをトレーニングするためにsklearnが提供するRandomForestClassifierを使用しています。
x_train, x_test, y_train, y_test = train_test_split(x_features,messages['label'],test_size=0.2)rf = RandomForestClassifier()rf_model = rf.fit(x_train,y_train)y_pred = rf_model.predict(x_test)precision = precision_score(y_test,y_pred,pos_label='spam')recall = recall_score(y_test,y_pred,pos_label='spam')print("precision = {} and recall = {}".format(round(precision,4),round(recall,4)))
データはトレーニングセットとテストセットに分割され、トレーニングセットはRandomForestClassifierに渡されてモデルが作成されます。このモデルはテストデータでテストされ、精度は1.0、再現率は0.8378となりました。(私がデータにいくつかの修正を加えたので、若干異なる値が表示される場合があります。)
一方、Word2vecはやや異なるアプローチで動作します。単語をその位置に基づいて研究します。これは、単語の近くにある単語を分析することによって行われます。単語の各出現の周囲には、あるサイズのウィンドウが作成されます。この方法で、単語の使用の文脈が学習されます。前の例で使用したデータセット上でどのように行われるかを見てみましょう。
データがクリーニングされ、トークン化され、以前と同様に新しい列に保存されます。そのデータをトレーニングデータとテストデータに分割し、Word2Vecモデルに渡すことができます。トークンのベクトル化は、gensimパッケージにあるWord2Vecクラスによって処理されます。
x_train、x_test、y_train、y_test = train_test_split(messages["clean_text"],messages["label"],test_size=0.2)
w2v_model = gensim.models.Word2Vec(x_train,vector_size=100,window=5,min_count=2)
w2v_model.save("mymodel.model")
トレーニングされたモデルは、ローカルシステムに保存することができるため、毎回トレーニングする必要はありません。
ここでは、最小カウントを2に設定しました。これは、データ全体で単語の出現回数が少なくとも2回ある場合にのみベクトルが作成されることを意味します。したがって、問題に影響を与えないいくつかの単語を排除することができます。
Word2Vecモデルには多くの組み込み機能があります。たとえば、モデル内で最も類似した単語を見つけたい場合は、most_similar()関数を使用することができます。
mymodel = Word2Vec.load("mymodel.model")
similar_words = mymodel.wv.most_similar("run")
print(similar_words)
[('pls', 0.9978137612342834), ('yes', 0.9977635145187378), ('r', 0.9977442026138306), ('win', 0.9977269768714905), ('today', 0.9976850152015686), ('im', 0.9976809024810791), ('get', 0.9976732134819031), ('reply', 0.9976603984832764), ('new', 0.9976487159729004), ('one', 0.9976474046707153)]
得られた出力は非常に興味深いです。これは、このトレーニングには小さなデータセットを使用したためです。gensimには、大量のWikipediaドキュメントで訓練された類似したモデルがあり、より正確な出力が得られます。
自然言語のベクトル化は、機械学習において非常に広範な適用範囲を持っています。この技術は他の領域でも適用することができます。感情分析、テキスト生成、機械DNA分類などがその応用例のいくつかです。word2vecの成功は、これらの分野の発展において重要な役割を果たしました。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles