自然言語処理の勉強

2023年技術ブログ集

WordCloud

ハードウェアの話が続いていましたが、大規模言語モデルが話題になり、少し自然言語処理を勉強しようと思い、文章の可視化で「WordCloud」と「Word2Vector」、PCに収まる大規模言語モデル「rinnna」、最後に感情分析の実装試験報告を行います。
 WordCloudで参考にしたのは、【実践】PythonでWordCloud(ワードクラウド)しようぜ!
| 趣味や仕事に役立つ初心者DIYプログラミング入門 (resanaplaza.com)です。
まず、文章を名詞や動詞などに分解する(形態素解析)解析器が必要です。日本語解析器として「MeCab」と「janome」が有名ですが、pipで簡単に導入できる「janome」を使用します。

文章を形態素解析して出現頻度の多い単語を文字の大きさで表現するツールがWordCloudです。プログラムコードは簡単で、予め形態素解析済の文書(単語をスペース区切りにしたもの)を準備し、Windowsのfontのパスを指定して、wordcloudライブラリを使うと、以下のようにたった5行で画像が生成されます。

まず、ここまでを追試してみます。 文書データとして別件でレポートした「アボカド仮説」
の一部を使い、人力で形態素解析し、抽出した単語をスペース区切りで入力テキストとしました。

これを、先ほどの5行(pltのコードを追加していますが)のプログラムに入力します。

で、出力された画像は以下のようになりました。

人力で分かち書き文書を生成するには限界があります。参考urlで「WordCloudMaker」という
独自ライブラリ(クラス)が提供されているので、そのまま使って、まるの文書ファイルを直接
読み込み画像を生成する(+不要単語を予め除去する処理)実装試験を行いました。
WordCloudMakerライブラリ内の5つの関数(青箱)機能は以下のようなものです。

WordCloudMakerを使ったプログラムコードを示します。

先ほど人力で行った「アボカド仮説」の分かち書きテキストでなく、なまのテキストを
読み込ませた結果と不要単語除去機能を使って「アボカド」と「仮説」を取り除いた
場合の生成画像をしまします。

もう少し長い文章を入れてみました。

そのままの画像と「中国」「ロシア」「海軍」「月」を取り除いた画像を生成しました。

以上です。 次はWord2Vectorです。形態素解析した単語間の関連を
WEBアプリのtensorboardを使って3D表示します。



Word2Vector

Word2Vectorは、言葉を計算機が処理しやすいように数値ベクトルに変換するもの
です。単語ごとに変換されるベクトルは100次元とかで、成分は文書学習した関連
単語の重みです。各単語間の相関はベクトル間のコサイン値が使用されます。
またベクトルなので単語間で足し算や引き算の演算が可能なようです。

まず、学習データを準備しました。私が先生をしている21回分の会議録(文章数=1000行)
を準備しました。会議録文書を張り合わせたものをメモ帳を使って「kigiroku.txt」として
しました。まず、不要単語や文字を除去し「text」(言語処理用テキストデータ)に取り込
みます。
以下、処理プログラムと結合した元テキストファイル「kaigiroku.txt」と不要単語処理をし
た「text」の冒頭100文字(確認)を出力したものを示します。

次に、形態素解析器janomeを使って、言語処理用テキストデータ「text」を読点「。」で
区切った文書単位で、形態素解析を行い「word_list」に保存します。
確認のため、読点「。」で分解した各文章の冒頭単語をピックアップしたものを示します。

ここから、Word2Vectorを使って文書の学習を行います。Word2Vectorを使うために
「gensim」ライブラリの導入が必要ですが、pipでインストール*できます。
*gensimは明らかに言語シミュレーションの略だと思います。
**アナコンダプロンプトで 「pip install gensim ⏎」なのですが、バージョンに
よってパラメータ設定に違いがあるので要注意です。(いつもの嫌がらせですね)
はまったところを赤文字で書きました。
学習モデル「model」生成コードは、たった1行です。
しかも1000行程度なら数秒で終わります。(あっけないです)

学習したモデルの確認をします。まず、print(model.dict[‘wv’][‘IoT’])で、
「IoT」という単語のwv(wordvector)をprintoutしました。100次元のベクトル成分が現れました。マイナス成分もあります。次に、most_similar関数を使って、「IoT」に関連の近い単語をリストアップします。
ret = model.wv.most_similar(positive=[‘IoT’]) 
for item in ret:
  print(item[0], item[1])
item[0]は単語で、item[1]はコサイン値です。(1に近いほど関連性が強い)

ここまでで、文書を形態素解析し不要単語を除去し読点で文章を分割し、word2vectorでモデル
を作るところまでを説明しました。 ここから本題のモデルの可視化を行います。
Google Colab を使うと学習モデルを表示するTensorboardを呼び出すことができるようですが
通常のJupyterNote環境では使用できないようです。
そこでWEB対応のTensorboardを使用しました。    http://projector.tensorflow.org/

Tensorboardに食わせるファイルが2つ必要です。「model」から以下2つのデータファイル
を抽出する必要があります。「tensors.tsv」⇔ベクトル値 と「metadata.tsv」⇔単語 です。
変換コードは、https://qiita.com/makaishi2/items/63b7986f6da93dc55edd
を参考にしています。(ありがたいです)pytorchのインストールが必要ですが、これもpipで行けます。

2つのファイルを以下のようにTensorBoardのアップロードします。

それでは、3D表示した結果を示します。「DX」という単語に関連のあるものが表示されました。

次に「AI」という単語で表示させてみました。

DesktopPCに収まる大規模言語モデル「rinnna」

動作環境はpython3.7以上のようです。
rinnnaのDLには12GB以上の空き容量が必要です。

rinnnaを起動するためのコードを示します。

DRAMが8GBでは動きませんでした。CPUモードで16GBのPCでは動作確認できましたが
応答スピードが非常に遅く毎回の応答まで数分かかります。

DRAM32GBでGPUメモリ12GBのDesktopPCで動作させましたが
GPUのメモリ不足でエラーとなりました。

GPUのメモリ使用量を減らすため、浮動小数点の精度を半分落とすことで(GPUメモリ
12GB以上の制約を6GB以上の抑えて)対応しました。
modelのパラメータに、 torch_dtype=torch.float16 を加えることで対策。

rinnnaは2023年5月にリリースされているため吉野ケ里遺跡の情報はInputされているため
chatGPTより正しい回答ができた。

しかし邪馬台国についての回答はだめですね。

タイトルとURLをコピーしました