日本語単語ベクトル"chiVe"をgensimやMagnitudeで使う
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)]
chiVe
"chiVe" (チャイブ, Sudachi Vector) は、超大規模コーパスと複数粒度分割に基づく日本語単語ベクトルです。
株式会社ワークスアプリケーションズの徳島人工知能NLP研究所と国立国語研究所の共同研究による成果で、前者の開発する形態素解析器「Sudachi」と、後者の作成する258億語規模の「国語研日本語ウェブコーパス(NWJC)」をもとにしています。Apache-2.0で公開しており、商用利用も可能です。
Sudachiによる複数粒度の分割結果を全て学習に使うことで、より長い固有表現や複合語が、その構成語との類似度が高くなるようになっています。 word2vec (gensim) を使用して、Skip-gramアルゴリズム (Mikolov+ 2013) で獲得しています。
詳細については、関連する発表文献をご覧ください;
- 論文: 複数粒度の分割結果に基づく日本語単語分散表現 (真鍋+ 2019, 第25回言語処理学会年次大会)
- 論文: chiVe 2.0: SudachiとNWJCを用いた実用的な日本語単語ベクトルの実現へ向けて (河村+ 2020, 第26回言語処理学会年次大会)
- スライド: chiVe: 製品利用可能な日本語単語ベクトル資源の実現へ向けて (第16回テキストアナリティクス・シンポジウム)
公開データ
Sudachiのバージョンや、正規化、足切り頻度の違いにより、いくつかのバージョンがあります。また、「テキスト」「gensim」「Magnitude」という3つのフォーマットでデータを公開しています。
データは、AWSさんの Open Data on AWS program によりホストしていただいております;
Sudachi Language Resources - Registry of Open Data on AWS
ダウンロードはコチラから → https://github.com/WorksApplications/chiVe
利用方法
テキスト
プレーンテキスト形式のデータ(オリジナルの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ワークスペースを用意しています。ぜひ気軽にご参加ください!
- https://sudachi-dev.slack.com/
- (こちらから招待を受けてください)
Discussion