今回は前回とは違ってgensimというすでに実装されているモデルを使って単語分散表現を学習させる方法を解説します。
gensimの使いかた
まずはgensimをインストールしましょう。
事前のインストール
!pip install gensim
次にノートブックのパスを通しておきます。
import sys
sys.path.append('/content/drive/MyDrive/自然言語処理編/chapter8')
そして必要な事前設定をしておきます
モジュールのインポート
import logging
from gensim.models.word2vec import Word2Vec, Text8Corpus
logging
: このモジュールは、ソフトウェアが実行される際に発生するイベントを追跡するために使用されます。Pythonの標準ライブラリの一部です。gensim.models.word2vec
: これはGensimライブラリのモジュールで、自然言語処理(NLP)に使用されます。Word2Vec
は、単語埋め込みを生成するためのword2vecモデルを訓練および使用するためのクラスです。Text8Corpus
は、word2vecモデルを訓練するための小さくてクリーンなデータセットであるText8データセットを処理するためのクラスです。
ロギングの設定
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
basicConfig
: この関数はロギングモジュールを設定します。format
パラメータはログメッセージの形式を指定します。この場合、各ログメッセージにはイベントの時刻(%(asctime)s
)、イベントの重大度レベル(%(levelname)s
)、およびメッセージ自体(%(message)s
)が含まれます。level=logging.INFO
: これはロギングレベルをINFO
に設定します。これにより、このレベル以上のすべてのイベント(例:WARNING
、ERROR
、CRITICAL
)が追跡されます。
このコードはイベントを追跡するためのロギングを設定し、word2vecモデルとText8データセットを使用するために必要なクラスをGensimライブラリからインポートしています。
残りのコード
残りはさほど複雑ではないのでコードに直接コメントを残しています。
# コーパスの読み込み
sentences = Text8Corpus('/content/drive/MyDrive/自然言語処理編/chapter8/data/ja.text8')
# モデルの学習
model = Word2Vec(sentences, vector_size=100, window=5, sg=1)
# モデルの保存
model.save('/content/drive/MyDrive/自然言語処理編/chapter8/models/model.bin')
# モデルの読み込み
model = Word2Vec.load('/content/drive/MyDrive/自然言語処理編/chapter8/models/model.bin')
どんな単語分散表現が得られたのかを確認
このライブラリを使ってできることは下記のとおりです。
- 単語の分散表現の取得
- 類似単語の検索
- アナロジータスク
- 単語間の類似度を計算
単語の分散表現の取得
下記のコードでは犬という単語の分散表現を得ることができます。
# 単語の分散表現の取得
model.wv['犬']
今回はvector_size=100:つまり次元数は100を設定しているので100次元の行列が得られるはずです
次元数は.shapeメゾットで取得できます。
# 分散表現の次元数を取得
model.wv['犬'].shape
類似単語の検索
類似単語の検索ができます
# 類似単語の検索
model.wv.most_similar('犬', topn=10)
上記のコードで犬という単語と類似性の高い単語top10を取得できます。
アナロジータスク
アナロジータスクという「王様」-「男性」+「女性」=「女王」のようなこともできます。
# アナロジータスク
model.wv.most_similar(positive=['ニューヨーク', '日本'], negative=['東京'])
上記のコードでは「東京:日本」というペアに対して「ニューヨーク:何か」という首都と国名のペアを考えさせるものですがこれを実行すると、上位にアメリカや米国といった正しい組み合わせが返ってきます。
特定の単語同士の類似度を計算
特定の単語同士の類似度を計算させることもできます。
# 単語間の類似度を計算
model.wv.similarity('日本', 'アメリカ')
gensimを使った単語分散表現を学んで
今回は前回、自分の手で一から実装した単語分散表現を得るためのモデルをすでに実装済みのモデルを使いました。計算のスピードも速く、自分でコードを書くよりもエラーなどが起きないためとても便利だと思いました。
次回は学習済みモデルの使い方について学んでいこうと思います。
この記事は下記の書籍を参考にしています。
コメント