日本語単語ベクトル"chiVe"をgensimやMagnitudeで使う

7 min read読了の目安(約6800字

TL;DR

  • chiVe (チャイブ): 日本語単語分散表現
    • 形態素解析器「Sudachi」 と 258億語規模コーパス「NWJC」
    • Apache-2.0, 商用利用可
    • gensimやMagnitude形式でもデータ公開
  • Magnitude: 分散表現を使うPythonライブラリ
    • 「gensim」のシンプルで速い代替ライブラリ
    • 未知語のベクトル作成
    • HTTP上でのリモートロードやストリーミング
from pymagnitude import Magnitude, MagnitudeUtils

# ダウンロード
# デフォルトのダウンロード先: `~/.magnitude/`
vectors = Magnitude(MagnitudeUtils.download_model("chive-1.1-mc90-aunit", remote_path="https://sudachi.s3-ap-northeast-1.amazonaws.com/chive/"))

# リモートでのロード
# 下記例は300MBのベクトル、検証環境で1分弱
vectors = Magnitude("https://sudachi.s3-ap-northeast-1.amazonaws.com/chive/chive-1.1-mc90-aunit.magnitude")

# リモートでのストリーム
# ローカルにファイルをダウンロードせず、ベクトルをすばやく取得
vectors = Magnitude("https://sudachi.s3-ap-northeast-1.amazonaws.com/chive/chive-1.1-mc90-aunit.magnitude", stream=True)
vectors.query("徳島")
# 類似度
vectors.similarity("酢橘", "徳島")
# 0.3993048

# 「すだち」は未知語: v1.1,1.2では正規化されている為
"酢橘" in vectors # True
"すだち" in vectors # False

# Magnitudeによる未知語ベクトルの作成
vectors.query("すだち") 
# array([ 0.03974148,  0.11290773,  0.01493122, ...])

# 未知語だが、似た字面の語が出る
vectors.most_similar("すだち", topn=3)
# [('あだち', 0.5930323079944302),
# ('すだ椎', 0.5872662462335323),
# ('だち', 0.5797546444016177)]

# 「阿波」 - 「徳島」 + 「高知」 = 「土佐」
vectors.most_similar(positive=["阿波", "高知"], negative=["徳島"], topn=3)
# [('土佐', 0.62003386),
# ('阿波踊り', 0.5988593),
# ('よさこい祭り', 0.578343)]

https://github.com/WorksApplications/chiVe

chiVe

"chiVe" (チャイブ, Sudachi Vector) は、超大規模コーパスと複数粒度分割に基づく日本語単語ベクトルです。

株式会社ワークスアプリケーションズの徳島人工知能NLP研究所国立国語研究所の共同研究による成果で、前者の開発する形態素解析器「Sudachi」と、後者の作成する258億語規模の「国語研日本語ウェブコーパス(NWJC)」をもとにしています。Apache-2.0で公開しており、商用利用も可能です。

Sudachi: Multi-granular tokenization

Sudachiによる複数粒度の分割結果を全て学習に使うことで、より長い固有表現や複合語が、その構成語との類似度が高くなるようになっています。 word2vec (gensim) を使用して、Skip-gramアルゴリズム (Mikolov+ 2013) で獲得しています。

chiVe: Training using multi-granular tokenization results

詳細については、関連する発表文献をご覧ください;

公開データ

Sudachiのバージョンや、正規化、足切り頻度の違いにより、いくつかのバージョンがあります。また、「テキスト」「gensim」「Magnitude」という3つのフォーマットでデータを公開しています。

データは、AWSさんの Open Data on AWS program によりホストしていただいております;
Sudachi Language Resources - Registry of Open Data on AWS

ダウンロードはコチラから → https://github.com/WorksApplications/chiVe

chiVe: Table

利用方法

テキスト

プレーンテキスト形式のデータ(オリジナルのword2vec Cフォーマット)です。

480443 300
の -0.08274004 -0.091033645 -0.08744463 -0.14393683 -0.053159036 ...
、 -0.014216528 -0.1027064 -0.07763326 -0.16008057 -0.16116066 ...
て -0.06049706 -0.15483096 0.052628547 -0.12448246 -0.14404581 ...
...

gensim

ライブラリgensimのための、KeyedVectors形式のデータです。

import gensim

vectors = gensim.models.KeyedVectors.load("./chive-1.1-mc90_gensim/chive-1.1-mc90.kv")

"すだち" in vectors # False, v1.1では正規化されているため
"酢橘" in vectors # True

vectors["酢橘"]
# array([-5.68204783e-02, -1.26615226e-01,  3.53190415e-02, -3.67305875e-01, ...])

vectors.similarity("酢橘", "徳島")
# 0.3993048

vectors.most_similar("徳島", topn=5)
# [('愛媛', 0.8229734897613525),
# ('徳島県', 0.786933422088623),
# ('高知', 0.7795713543891907),
# ('岡山', 0.7623447179794312),
# ('徳島市', 0.7415297031402588)]

vectors.most_similar(positive=["阿波", "高知"], negative=["徳島"], topn=5)
# [('土佐', 0.620033860206604),
# ('阿波踊り', 0.5988592505455017),
# ('よさこい祭り', 0.5783430337905884),
# ('安芸', 0.564490556716919),
# ('高知県', 0.5591559410095215)]

Magnitude

ライブラリMagnitude形式のデータです。デフォルトのパラメーターで変換されています(高度な未知語サポート有り、近似最近傍インデックス無し。Magnitudeが公開しているモデルのMedium相当)。

「未知語のベクトル」は、主に「未知語の文字n-gram」と「文字列として似ている既知語のベクトル」をもとに、その場で作成されています。詳細は、Magnitudeを開発する方々らによる論文をご覧ください; (Patel+ 2018)

from pymagnitude import Magnitude

vectors = Magnitude("chive1.1-mc90.magnitude")

"すだち" in vectors # False, v1.1では正規化されているため
"酢橘" in vectors # True

vectors.query("すだち") # Magnitudeによるサブワードを使った未知語サポートによる
# array([ 0.03974148,  0.11290773,  0.01493122, -0.05296252,  0.12616251, ...])

vectors.most_similar("すだち", topn=5)
# [('あだち', 0.5930323079944302),
# ('すだ椎', 0.5872662462335323),
# ('だち', 0.5797546444016177),
# ('ムクノキ', 0.46228053338159725),
# ('椨', 0.4482612387097178)]

vectors.similarity("酢橘", "徳島")
# 0.3993048

vectors.most_similar("徳島", topn=5)
# [('愛媛', 0.8229735),
# ('徳島県', 0.78693324),
# ('高知', 0.7795714),
# ('岡山', 0.7623447),
# ('徳島市', 0.7415296)]

vectors.closer_than("徳島", "徳島市")
# ['愛媛', '徳島県', '高知', '岡山']

vectors.most_similar(positive=["阿波", "高知"], negative=["徳島"], topn=5)
# [('土佐', 0.62003386),
# ('阿波踊り', 0.5988593),
# ('よさこい祭り', 0.578343),
# ('安芸', 0.56449056),
# ('高知県', 0.55915594)]

vectors.most_similar_cosmul(positive=["阿波", "高知"], negative=["徳島"], topn=5)
# [('土佐', 0.83830714),
# ('よさこい祭り', 0.82048166),
# ('阿波踊り', 0.8168015),
# ('安芸', 0.80880433),
# ('伊予', 0.80250806)]

ライブラリを使っての、ダウンロード、リモートでのロード、HTTP上のリモートでのストリームも可能です。

from pymagnitude import Magnitude, MagnitudeUtils

# ダウンロード
vectors = Magnitude(MagnitudeUtils.download_model("chive-1.1-mc90-aunit", remote_path="https://sudachi.s3-ap-northeast-1.amazonaws.com/chive/"))
 # デフォルトのダウンロード先: `~/.magnitude/`
 # ファイルが既にダウンロードされている場合は、再度ダウンロードしない
 # 引数 `download_dir` でローカルのダウンロード先を変更できる

# リモートでのロード
vectors = Magnitude("https://sudachi.s3-ap-northeast-1.amazonaws.com/chive/chive-1.1-mc90-aunit.magnitude")

# HTTP上のリモートでのストリーム
vectors = Magnitude("https://sudachi.s3-ap-northeast-1.amazonaws.com/chive/chive-1.1-mc90-aunit.magnitude", stream=True)
vectors.query("徳島") # ローカルにファイルをダウンロードせず、ベクトルをすばやく取得

コミュニティ

開発者やユーザーの方々が質問したり議論するためのSlackワークスペースを用意しています。ぜひ気軽にご参加ください!