【Word2vecモデル生成・超入門編】gensim、ja.text8、chiVe(チャイブ)【Python】


# はじめに
プログラムの講師をしていた時期があります。あの頃は、「超入門編」になりそうなネタをいつもさがしていたので、自分の思いつきを記事にまとめてみる事にしました。

### この記事のターゲット
- Word2vecがよく分からなくなってしまった人
- AI超初心者相手に教鞭をとっている、プログラムの先生な人
- 無償で商用利用可能な汎用Word2vecモデルをさがしている人

# 概要
無償で商用利用可能なWord2vecモデル(chiVe)の事も扱います。
商用書籍などでもたびたび登場する、「[ja.text8](https://hironsan.hatenablog.com/entry/japanese-text8-corpus "Hironsan氏")」を使ってモデルを作る方法も掲載しています。

①1636文字しか用意がないのに、Word2vecモデルを作り、使ってみる
②「ja.text8」からWord2vecモデルを作り、使ってみる
③無償で商用利用可能な日本語Word2vecモデルを使ってみる

体感していただく記事として仕上げてみました。
上記の段取りで記事は進行します。よかったら研修や講習、勉強会のネタに、どぞっ！

# 用意した1636文字はこちら
[外務省『国・地域』](https://www.mofa.go.jp/mofaj/area/index.html "外務省")
```python:make_txt_country_names.py
i_loop = 1
stri_country_names = "アイスランド共和国 アイルランド アゼルバイジャン共和国 アフガニスタン・イスラム共和国 アメリカ合衆国 アラブ首長国連邦 アルジェリア民主人民共和国 アルゼンチン共和国 アルバニア共和国 アルメニア共和国 アンゴラ共和国 アンティグア・バーブーダ アンドラ公国 イエメン共和国 イスラエル国 イタリア共和国 イラク共和国 イラン・イスラム共和国 インド インドネシア共和国 ウガンダ共和国 ウクライナ ウズベキスタン共和国 ウルグアイ東方共和国 英国（グレートブリテン及び北アイルランド連合王国） エクアドル共和国 エジプト・アラブ共和国 エストニア共和国 エスワティニ王国 エチオピア連邦民主共和国 エリトリア国 エルサルバドル共和国 オーストラリア連邦 オーストリア共和国 オマーン国 オランダ王国 ガーナ共和国 カーボベルデ共和国 ガイアナ共和国 カザフスタン共和国 カタール国 カナダ ガボン共和国 カメルーン共和国 ガンビア共和国 カンボジア王国 北マケドニア共和国 ギニア共和国 ギニアビサウ共和国 キプロス共和国 キューバ共和国 ギリシャ共和国 キリバス共和国 キルギス共和国 グアテマラ共和国 クウェート国 クック諸島 グレナダ クロアチア共和国 ケニア共和国 コートジボワール共和国 コスタリカ共和国 コソボ共和国 コモロ連合 コロンビア共和国 コンゴ共和国 コンゴ民主共和国 サウジアラビア王国 サモア独立国 サントメ・プリンシペ民主共和国 ザンビア共和国 サンマリノ共和国 シエラレオネ共和国 ジブチ共和国 ジャマイカ ジョージア シリア・アラブ共和国 シンガポール共和国 ジンバブエ共和国 スイス連邦 スウェーデン王国 スーダン共和国 スペイン王国 スリナム共和国 スリランカ民主社会主義共和国 スロバキア共和国 スロベニア共和国 セーシェル共和国 赤道ギニア共和国 セネガル共和国 セルビア共和国 セントクリストファー・ネービス セントビンセント及びグレナディーン諸島 セントルシア ソマリア連邦共和国 ソロモン諸島 タイ王国 大韓民国 タジキスタン共和国 タンザニア連合共和国 チェコ共和国 チャド共和国 中央アフリカ共和国 中華人民共和国 チュニジア共和国 チリ共和国 ツバル デンマーク王国 ドイツ連邦共和国 トーゴ共和国 ドミニカ国 ドミニカ共和国 トリニダード・トバゴ共和国 トルクメニスタン トルコ共和国 トンガ王国 ナイジェリア連邦共和国 ナウル共和国 ナミビア共和国 ニウエ ニカラグア共和国 ニジェール共和国 ニュージーランド ネパール連邦民主共和国 ノルウェー王国 バーレーン王国 ハイチ共和国 パキスタン・イスラム共和国 バチカン市国 パナマ共和国 バヌアツ共和国 バハマ国 パプアニューギニア独立国 パラオ共和国 パラグアイ共和国 バルバドス ハンガリー バングラデシュ人民共和国 東ティモール民主共和国 フィジー共和国 フィリピン共和国 フィンランド共和国 ブータン王国 ブラジル連邦共和国 フランス共和国 ブルガリア共和国 ブルキナファソ ブルネイ・ダルサラーム国 ブルンジ共和国 ベトナム社会主義共和国 ベナン共和国 ベネズエラ・ボリバル共和国 ベラルーシ共和国 ベリーズ ペルー共和国 ベルギー王国 ポーランド共和国 ボスニア・ヘルツェゴビナ ボツワナ共和国 ボリビア多民族国 ポルトガル共和国 ホンジュラス共和国 マーシャル諸島共和国 マダガスカル共和国 マラウイ共和国 マリ共和国 マルタ共和国 マレーシア ミクロネシア連邦 南アフリカ共和国 南スーダン共和国 ミャンマー連邦共和国 メキシコ合衆国 モーリシャス共和国 モーリタニア・イスラム共和国 モザンビーク共和国 モナコ公国 モルディブ共和国 モルドバ共和国 モロッコ王国 モンゴル国 モンテネグロ ヨルダン ラオス人民民主共和国 ラトビア共和国 リトアニア共和国 リビア リヒテンシュタイン公国 リベリア共和国 ルーマニア ルクセンブルク大公国 ルワンダ共和国 レソト王国 レバノン共和国 ロシア連邦 北朝鮮 台湾 パレスチナ 香港 マカオ 北極 南極"
lis_data_file_output = []
for i in range(i_loop):
    if i > 0:
        lis_data_file_output.append(" ")
    lis_data_file_output.append(stri_country_names)
fil_data_output = open("./country_names.txt", "w", encoding="UTF-8") 
fil_data_output.writelines(lis_data_file_output)
fil_data_output.close()
print("国名ファイル " + str(i_loop) + " ループ分できた")
```
どこからどう見ても、『国・地域』名称です。半角スペースで区切ってあります(ようは分かち書き状態)。
国名の出現回数を増やす(プログラム内「i_loop = 1」の値を増加させる)と、Word2vecの結果が変わります。
ファイル出力プログラムの形で掲載してみましたが、上記プログラムを使わず、『国・地域』名称を、テキストファイル(country_names.txt)にコピペでもokです。

# gensim(ジェンシム)
自然言語処理の為のオープンソースライブラリ「gensim」を利用する事で、簡単にWord2vecモデルを作ったり使ったりできます。

※「gensim」を初めて使う場合、pipしてください(この記事では「gensim4.1.2」を使って実験しています)。
```python:【pipの例】
!pip install gensim==4.1.2
```
```python:make_model_country_names.py
from gensim.models import word2vec
import logging

logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
sentences = word2vec.Text8Corpus('./country_names.txt')

model = word2vec.Word2Vec(sentences, vector_size=50, min_count=1, window=30, epochs=10)
model.wv.save_word2vec_format("./country_names.model")

print("「min_count」を「1」にする事で、学習データが極端に少なくてもモデル生成が可能です。")
print("(単語の出現回数が、最低「1」回あればモデルに登録する、という意味です)")
print("∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽∽")
print("country_names.modelできた")
```
以下のようなログが少しずつ出力されてきます。
```text:
INFO : collected 202 word types from a corpus of 202 raw words and 1 sentences
```
『国・地域』が202なので、「202」ワードになっています。

# 環境
※gensimのバージョン違いでうまくいかない場合があります(筆者もgensim3→4問題で苦労した経験あり)。記事とバージョン違いを試したいのであれば、gensimを呼び出すコードを調整してください。

実験は以下の環境でおこなっています。
- gensim……4.1.2
- python……3.9.7

インターネット上に公開されているgensim系の記事および商用書籍掲載コードは、現状、gensim『3』のものが多いです。

# Word2vecに、似ている単語を選ばせる
```python:test_w2v.py
from gensim.models import word2vec
stri_country_name = "南極"
model = word2vec.KeyedVectors.load_word2vec_format("./country_names.model")
print("【(Word2vecが、『"  + stri_country_name +"』と似ている国だと選んだ)トップ5(topn=5)】")
print(model.most_similar(positive = [stri_country_name], topn=5))
```
```text:出力結果
【(Word2vecが、『南極』と似ている国だと選んだ)トップ5(topn=5)】
[('マカオ', 0.328559935092926), ('リトアニア共和国', 0.3275766968727112), ('パキスタン・イスラム共和国', 0.3062097430229187), ('エルサルバドル共和国', 0.2783428430557251), ('グレナダ', 0.27684202790260315)]
```
うはっ！　トップ1が0.328559935092926しか似ていない！　単語をベクトル化(数値で表現)してみたけど、学習足りなさすぎ！
ちなみに「i_loop = 5」にして、『国・地域』を5回出現させると、結果に明らかな変化が見られます。
```text:
例：マカオが0.328559935092926から0.945113480091095に大幅up！
```
南極とマカオが、(少ない)データ内に何度も出現する事になります。なのでWord2vecは、それを「めちゃくちゃ似てる！」と判断してしまったのです。

(他の『国・地域』同士でも、明らかに数値が大幅upします)

# 「min_count=1」を指定している
極小データでWord2vecモデル生成ができる理由は、単語の出現回数を最低「1回(min_count=1)」と指定しているからです。だから、学習に成功してしまっているのです。

「min_count=5」にしているサンプルをよく見かけます。
[gensimの公式サイト](https://radimrehurek.com/gensim/models/word2vec.html#gensim.models.word2vec.Word2Vec "gensim公式")で確認してもらえば分かる通り、そもそもデフォルト値が「min_count=5」です。

Word2vecの元にするデータ量が多い場合、「min_count=30」くらいにしないと、余分なキーワード(単語)ばかりが登録されてしまうので注意が必要です。

以下のエラーメッセージが表示される場合、元データとmin_countの関係がちぐはぐなのだと思われます。
```text:
RuntimeError: you must first build vocabulary before training the model
```
『国・地域』の出現回数を4回以下(「i_loop = 4」以下)にして、さらに、「min_count=5」もしくはmin_countを省略すると、簡単にエラー発生を確認できます。

# ベクトル同士の足し算・引き算してみる
たとえば「ロンドン」－「イギリス」＋「アメリカ」を、ベクトル同士として足し算・引き算して、「ワシントン」という答えを出したいやつです。Word2vecの資料を見ているとたいてい書いてあるので、初見ではない人が多いのではないでしょうか。
「positive」と「negative」が、「足し算」と「引き算」の意味になります。

注意点として一つ。首都という条件ではなく、その国の都市という意味で「ニューヨーク」という答えが返ってきても間違いではありません。ようはWord2vecモデルを作る際のデータ次第です。
```text:
我が華麗さを見よとばかりにアメリカのニューヨークが自信に溢れた貌を世界に向けるように、イギリスのロンドンは、絢爛で、栄光に満ちた雰囲気を漂わせている。
```
と、紹介する文章があってもおかしくはなく、こういう文章を元にしてWord2vecが学習していれば当然の結果です。

1636文字で作った「なんちゃってモデル」に首都名を登録していない事もあり、今回は「香港とマカオ」をプラスに、「北極」をマイナスに配置して計算させてみます。
国際的なイメージのある地名ばかりです。
```python:test_w2v.py
from gensim.models import word2vec
model = word2vec.KeyedVectors.load_word2vec_format("./country_names.model")
print(model.most_similar(positive=["香港", "マカオ"], negative=["北極"], topn=5))
```
```text:出力結果
[('コンゴ民主共和国', 0.32517656683921814), ('ジャマイカ', 0.2853414714336395), ('カーボベルデ共和国', 0.2659941017627716), ('マダガスカル共和国', 0.2461387813091278), ('スリランカ民主社会主義共和国', 0.2448992282152176)]
```
うーん。コメントに困る結果になりました……。
これは「なんちゃってモデル」の出力結果です。もっとまともなデータを使ってモデルを作るフェーズに移行しますね。

「なんちゃってモデル」作りは、全体が見渡せる程度のテキストを元データにした実験でした。

# 日本語版text8コーパスでWord2vec
全体が見渡せる程度のテキストを使った「なんちゃってモデル」の実験を終えて、もう少し本格的なWord2vecを試してみます。

自然言語処理の勉強をしている人なら、一度くらいは「ja.text8」という言葉を聞いた事があるのではないでしょうか。これを元データにモデルを作ります。
テキストのクリーニング、形態素解析器MeCabによる分かち書き処理が施された、約100MBのテキストデータです(全体が見渡せないほどのテキスト量です)。

『[日本語版text8コーパスを作って分散表現を学習する](https://github.com/Hironsan/ja.text8 "Hironsan氏")』

上記ページにアクセスして少しスクロールして下にさがると「ja.text8.zip」というリンクがあります。それをダウンロードします。zipを解凍してください。

# 「ja.text8」でモデル作成
しっかり単語数があるので、「min_count=5」で作ってみます。
```python:make_model_jatext8.py
from gensim.models import word2vec
import logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
sentences = word2vec.Text8Corpus("./ja.text8")
model = word2vec.Word2Vec(sentences, vector_size=200, min_count=5)
model.wv.save_word2vec_format("./jatext8.model")
print("jatext8.modelできた")
```
データ量が多いので、モデルが完成するまで少し時間がかかります。
```text:
INFO : collected 290811 word types from a corpus of 16900026 raw words and 1691 sentences
```
16,900,026コーパス、290,811ワード、胸が高鳴る数字です。
公式通り「vector_size=200(gensim4.1.2版)」指定で作ると、約170MBのモデルが完成しました。先ほどの「なんちゃってモデル」は100KBちょっとだったので雲泥の差です！
```python:test_w2v.py
from gensim.models import word2vec
model = word2vec.KeyedVectors.load_word2vec_format("./jatext8.model")
print(model.most_similar(positive=["香港", "マカオ"], negative=["北極"], topn=5))
```
```text:出力結果
[('パラリンピック', 0.5925494432449341), ('西ドイツ', 0.5897905826568604), ('共催', 0.5797169804573059), ('インターナショナル', 0.5794147849082947), ('モントリオール', 0.5785273909568787)]
```
先ほどの「なんちゃってモデル」とはまったく違う結果になりました。香港とマカオを足し算すると、同じく国際的なイメージのある北極を引き算しても、国際的っぽいイメージが残るようです。
```python:
print(model.most_similar(positive = ["日本"], topn=5))
```
```text:出力結果
[('韓国', 0.5736452341079712), ('中国', 0.5507934093475342), ('アメリカ', 0.5199224352836609), ('台湾', 0.46018266677856445), ('英国', 0.4577477276325226)]
```
もちろん『日本』は登録されていました。距離が近い国とアメリカと英国が選ばれました。
```python:
print(model.most_similar(positive = ["アニメ"], topn=5))
```
```text:出力結果
[('ドラマ', 0.8026232123374939), ('実写', 0.7657089233398438), ('ova', 0.7405120730400085), ('アニメーション', 0.728629469871521), ('本編', 0.7127887010574341)]
```
『アニメ』に近い用語が見事に選ばれています。

# 「ja.text8」は商用利用可能ですが
商用書籍の説明に使用されているのもよく見かけます。

ライセンスが「[CC-BY-SA](https://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AA%E3%82%A8%E3%82%A4%E3%83%86%E3%82%A3%E3%83%96%E3%83%BB%E3%82%B3%E3%83%A2%E3%83%B3%E3%82%BA%E3%83%BB%E3%83%A9%E3%82%A4%E3%82%BB%E3%83%B3%E3%82%B9 "Wikipedia")」なので、必ず「ja.text8」作者さまのクレジット表示をおこなってください。
またこれを使って作ったものにも、「ja.text8」作者さまのクレジット表示が必要です(Web記事などからはurlリンクがよいと思います)。

# 無償で商用利用可能な大容量モデル
「ja.text8」のような大きなテキストデータ(しかもテキストマイニング済み)を用意するのはかなり苦労します。完成しているものがほしくなります。

# chiVe(チャイブ)
[https://github.com/WorksApplications/chiVe](https://github.com/WorksApplications/chiVe "株式会社ワークスアプリケーションズ")

chiVe(チャイブ)とは、国立国語研究所と株式会社ワークスアプリケーションズが、「Apache License 2.0」で提供している汎用的な単語が登録されたモデルです。
日本語形態素解析器Sudachiを使った日本語単語ベクトルです。

「Apache License 2.0」なので、ライセンス情報を含む形で、商用再配布が可能です。
これはとても助かります。
モデルのサイズは600MB～3.8GBの4種類あり、必要な単語の数とメモリ使用量を考えながら選べるのも嬉しいポイント。

「Apache License 2.0」については、[このページ](https://search-bank.net/article.php?id=471 "ナガヤン氏")がよくまとまっています。

研修や勉強会、そしてこういった記事を書くならマジでありがたい配布モデル。

# chiVeのよい点
- 汎用的な単語が登録されている
- 4種類あるので、登録単語数や処理速度の違いを検討できる
- メンテナンスが2021年07月にあったっぽい

v1.2を4種類ともダウンロードしてみました。中身のファイルの更新日を見る限り、メンテナンスが2021年にあったっぽいのです。無料配布の学習済みモデルは、5年くらい放置されているものも多いので……、メンテナンスが頻繁におこなわれているのは、それだけでも大きなメリットです。

# 語彙数が多い
chiVeの一番小さなモデルmc90(600MB)版は、「min_count=90」を指定して生成されたものです。だから「chive-1.2-mc90」という命名。ですが語彙数482,223なのでかなり使えます。
mc5(3.8GB)版は、「min_count=5」で作られたものです。なんと語彙数3,197,456！

# chiVeを試してみた
バージョンは、1.2を使ってみました(300次元のベクトルです)。
サイズが一番小さいmc90(600MB)版を例に、使い方を少し。「chive-1.2-mc90.kv.vectors.npy」と「chive-1.2-mc90.kv」は、両方必要なので、同じディレクトリに配置してください。プログラム内で指定するのは「chive-1.2-mc90.kv」のほうです。

[chiVe公式サイト](https://github.com/WorksApplications/chiVe "株式会社ワークスアプリケーションズ")で指定されている通り、『gensim.models.KeyedVectors.load("./chive-1.2-mc90.kv")』を使って呼び出します。

# Windows環境でtar.gz圧縮の解凍がしたい
「[7-Zip](https://ja.wikipedia.org/wiki/7-Zip "Wikipedia")」はいかがですか。

# 『日本』と似た単語(chiVeにて)
【chiVe(チャイブ)mc5(3.8GB)版】
```python:
import gensim
model = gensim.models.KeyedVectors.load("./chive-1.2-mc5.kv")
print(model.most_similar(positive=["日本"], topn=5))
```
```text:出力結果
[('アメリカ', 0.6829983592033386), ('国内', 0.6607694625854492), ('日本国内', 0.6377283930778503), ('韓国', 0.6334121227264404), ('外国', 0.6329292058944702)]
```
【chiVe(チャイブ)mc90(600MB)版】
```python:
import gensim
model = gensim.models.KeyedVectors.load("./chive-1.2-mc90.kv")
print(model.most_similar(positive=["日本"], topn=5))
```
```text:出力結果
[('アメリカ', 0.7013115286827087), ('国内', 0.67961186170578), ('外国', 0.6487310528755188), ('アジア', 0.6481220126152039), ('日本国内', 0.6446441411972046)]
```
登録語彙数の多いmc5(3.8GB)版と登録語彙数の少ないmc90(600MB)版で少し違いがありました。
「ja.text8」から作り出したモデルでは、外国名称が特に関連性が高いという扱いでしたが、chiVeでは「アジア」や「国内」という単語が選ばれました。地域にも重みがつけられているようです。

# 『香港・マカオ・北極』の結果(chiVeにて)
```python:
import gensim
model = gensim.models.KeyedVectors.load("./chive-1.2-mc5.kv")
print(model.most_similar(positive=["香港", "マカオ"], negative=["北極"], topn=5))
```
```text:出力結果
[('シンガポール', 0.6177148222923279), ('広州', 0.5976095199584961), ('上海', 0.5911610126495361), ('深セン', 0.5900965332984924), ('珠海', 0.5771510004997253)]
```
「観光都市」「中国の地名」「マカオ周辺」が選ばれました。北極を引き算しても、香港とマカオのイメージが揺らぐ様子はないという事ですね。
人間に伝わる結果が、しっかりと出力されました。

と、このような感じで、使用するモデル(の元データ)によって結果がかなり変わります。
Word2vec技術を使ったからといって、「ロンドン」－「イギリス」＋「アメリカ」で、「ワシントン」にならない訳です。

# 学習データにないキーワード(単語)
最初に作った「なんちゃってモデル」を使用する際、『日本』を指定するとエラーになります。
```python:
print(model.most_similar(positive = ["日本"], topn=5))
```
```text:出力結果
KeyError: "Key '日本' not present"
```
『日本』が、「なんちゃってモデル」に登録されていない単語だからです。よく考えてください。外務省が発表している『国・地域』名称なので、自国である『日本』が入っているはずがないではありませんか。
学習データにない単語は、見つけられないのです。
```python:
if "日本" in model.key_to_index:
  print("指定キーワードあり")
else:
  print("指定キーワードなし")
```
上のようなif文を組んで確認するか、『日本』を学習データに加える事で対応します。

# キーワードがないと何が困るのか
記事が長くなりすぎないようにざっくり説明します。たとえば以下の4つの文を使って、「植物」に対するニーズ調査をしたいと仮定します。
```text:
チーゼルを買いたい。
ラシャカキグサの名所に行きたい。
コンサートのチケットを買いたい。
コンサートに行きたい。
```
チーゼルと聞いてピンとこない人も多いのではないでしょうか。植物の名前で、chiVeに登録されています。ですが、チーゼルの和名『ラシャカキグサ(羅紗掻草と書きます)』は登録されていません(ドライフラワーになった状態でよく見かける植物です)。

Word2vecは単語だけでなく、文章同士のベクトル比較の際にも使用できます。
ただキーワード(単語)登録がないと、情報が抜けてしまいます。

# Word2vecを使った文章同士の比較
以下、数値が高いほど、類似度が高いと考えてください。

【「植物」に対するニーズ調査が目的、と仮定】
```text:
「チーゼルを買いたい。」という文章との類似度
0.13343596666762175:ラシャカキグサの名所に行きたい。
0.3593537865768118:コンサートのチケットを買いたい。
0.13821345335561563:コンサートに行きたい。
```
```text:
「ラシャカキグサの名所に行きたい。」という文章との類似度
0.13343596666762175:チーゼルを買いたい。
0.3539220378554387:コンサートのチケットを買いたい。
0.6846381752471125:コンサートに行きたい。
```
(名詞「ラシャカキグサ」の登録がないので、動詞「買い(買う)」「行き(行く)」を含む文章のほうが、『類似度が高い』と判定されています)
```text:
コンサートの文章同士は、動詞が違っても、「チケット」という別の名詞がまじっても、比較的似ている文章だと判定されます。
0.6875469883420032　:　コンサートに行きたい。　/　コンサートのチケットを買いたい。
```
ソースコードの掲載は、あまりにも長くなりすぎるのでこの記事では省略します(また改めて、説明つきで掲載する事を考えます)。

# 「×アサガオ」「×あさがお」「〇朝顔」
> 【chiVe(チャイブ)の公式より】
> 「正規化」は、形態素解析器Sudachiによる表記統制です。例えば 空き缶, 空缶, 空き罐, 空罐, 空きカン, 空きかん はすべて正規化表記 空き缶 に統制されます。

テキストマイニングや文章ベクトル比較だけで一記事書けてしまうくらいの説明が必要なので、軽く触れる程度にとどめます。

# 自然言語処理はマジで難しい
マニアックなサブカル用語はそこまで必要ありませんが、たとえば「言わばマスオさん」という言葉は、よく見聞きします。

「孫悟空みたいなヘアスタイルになれるハードワックスがほしい」と接客チャットボットに入力してくるユーザーはいそうな気がします。

人間相手なら、周辺の文脈を確認して、あっさり理解してくれそうな事なのに。

# 『国民的アニメ』サザエさんとドラゴンボール
先ほど作った「ja.text8」モデルには、サザエさんの登録がありました。ドラゴンボールの登録はありませんでした。
```python:
print(model.most_similar(positive = ["サザエさん"], topn=5))
```
```text:出力結果
[('クレヨンしんちゃん', 0.8473690748214722), ('類聚', 0.832035481929779), ('燃えよ', 0.8311367630958557), ('はだし', 0.8252650499343872), ('檸檬', 0.8218318223953247)]
```
クレヨンしんちゃん以外はよく分からない結果になりました。
はだし……のゲン？
(注：ja.text8モデルの作り方次第で、出力結果が変わります)

# chiVeのmc5(3.8GB)版のドラゴンボール
サザエさんの登録はありませんでしたが、chiVeのmc5(3.8GB)版には、ドラゴンボールが登録されていました。
```python:
import gensim
model = gensim.models.KeyedVectors.load("./chive-1.2-mc5.kv")
print(model.most_similar(positive=["ドラゴンボール"], topn=5))
```
```text:出力結果
[('スーパーベジット', 0.5206392407417297), ('ルアートハーフドラゴンボール', 0.5140939950942993), ('アニメヒーローズシリーズ', 0.5132525563240051), ('レアベジータ', 0.5124936699867249), ('エピソードオブバーダック', 0.5072979927062988)]
```
ググって調べてみると、『商品名』を学習している気がします。レアなんちゃらが含まれているので……『中古品情報』も学習していそうだ。
たしかにサザエさんの商品って、ほとんど発売されていない。
アニメとしてではなく、ドラゴンボールという名称を含む『商品』が多いから、ドラゴンボールを学習しているのではないかな？

『国民的アニメ』を打ちこんでみると、何を元データに学習したのかが、何となく見える場合があります。おまけ情報程度に。

# 自分のデータを使ってモデルを作りたい
以下のリンクが参考になりますが、『gensim4.1.2』では動きません。
[https://qiita.com/makaishi2/items/63b7986f6da93dc55edd](https://qiita.com/makaishi2/items/63b7986f6da93dc55edd "Qiita")

gensimのバージョン違い問題は、この件に限らず発生する可能性が高いので、[gensimの公式サイト](https://radimrehurek.com/gensim/models/word2vec.html#gensim.models.word2vec.Word2Vec "gensim公式")を都度確認して修正対応してください。
前述の事を踏まえ、ソースコードの説明ではなく、具体的にどのようにテキストの加工をすればよいのかを紹介する事にしました。

# 参考リンクのコードの動きについて
```text:
楽しいコンサートに行ってきますが、門限21時の約束は必ず守りますね。
```
上記の若干くどいと感じるような文章を形態素解析すると以下のようになります。
```text:
楽しい	形容詞,自立,*,*,形容詞・イ段,基本形,楽しい,タノシイ,タノシイ
コンサート	名詞,一般,*,*,*,*,コンサート,コンサート,コンサート
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
行っ	動詞,自立,*,*,五段・カ行促音便,連用タ接続,行く,イッ,イッ
て	助詞,接続助詞,*,*,*,*,て,テ,テ
き	動詞,非自立,*,*,カ変・クル,連用形,くる,キ,キ
ます	助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス
が	助詞,接続助詞,*,*,*,*,が,ガ,ガ
、	記号,読点,*,*,*,*,、,、,、
門限	名詞,一般,*,*,*,*,門限,モンゲン,モンゲン
21	名詞,数,*,*,*,*,21,*,*
時	名詞,接尾,助数詞,*,*,*,時,ジ,ジ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
約束	名詞,サ変接続,*,*,*,*,約束,ヤクソク,ヤクソク
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
必ず	副詞,助詞類接続,*,*,*,*,必ず,カナラズ,カナラズ
守り	動詞,自立,*,*,五段・ラ行,連用形,守る,マモリ,マモリ
ます	助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス
ね	助詞,終助詞,*,*,*,*,ね,ネ,ネ
。	記号,句点,*,*,*,*,。,。,。
```
形態素解析で取得できた「品詞,品詞細分類1,品詞細分類2,品詞細分類3」。この中で「品詞」が、『名詞・動詞・(形容詞)』のものだけを取り出します。
```text:【プレーンテキスト状態】
楽しいコンサートに行ってきますが、門限21時の約束は必ず守りますね。
時間を忘れて楽しんできます。
お土産を楽しみにしていてください。
```
```text:【(資料として分かりやすくする為、「|」を入れて区切ってあります)】
楽しい|コンサート|行く|くる|門限|21|時|約束|守る
時間|忘れる|楽しむ|くる
土産|楽しみ|する|いる|くださる
```
※動詞は「基本形(base_form(行っ→行く))」に変更して登録しています。ただ最終的な使用目的によっては、surface(行っ)のままのほうがよいです(必要ならですが)。

この状態↓が、モデル生成の材料になる
```text:【「品詞」が、『名詞・動詞・(形容詞)』のみ使う】
[['楽しい', 'コンサート', '行く', 'くる', '門限', '21', '時', '約束', '守る'], ['時間', '忘れる', '楽しむ', 'くる'], ['土産', '楽しみ', 'する', 'いる', 'くださる']]
```
※形容詞を加えない場合、この例では「楽しい」をデータに加えない事になります。最終的な使用目的によっては、助詞・副詞なども登録します(必要ならですが)。

上のように「配列の配列」の状態に加工して、Word2vecモデル作りのデータとして使用します。
説明用に、手作業でも事足りるくらいの量で掲載しています。

元データが大量に集められない場合、「min_count=1」を指定して、無理矢理学習させる事も可能です(使いものになるかは別ですが、動作テストはすぐできます)。

参考リンクのコードの動きは、このような感じになっています。
念の為もう一度、[参考リンク](https://qiita.com/makaishi2/items/63b7986f6da93dc55edd "Qiita")は、『gensim』が『3』の頃の記事なので、[gensimの公式サイト](https://radimrehurek.com/gensim/models/word2vec.html#gensim.models.word2vec.Word2Vec "gensim公式")などを参考に調整してください。

# 最後に
見ていただいた通り、データ量が少なくても、モデル生成を試す事はできます。ご自分のブログ文章、ネット小説、レポートなどを使ってモデルを作ってみてください。

chiVeの処理速度ですが、語彙数の少ないmc90(600MB)版を使ったほうが圧倒的にはやいです。登録語彙数が少なくても、使い勝手はよいです。

記事がかなり長くなってしまいました。長文を読んでくださってありがとうございました。
## 　
- [ドラ●エのモンスター名っぽい文章生成してみる](https://qiita.com/ka-son11/items/59d991c15c5d64284eeb "Qiita")
- [シナリオライターがAI技術を開拓して文章生成してみる(1)](https://qiita.com/ka-son11/items/bd15a38bcce2c496df1b "Qiita")