はじめに
長文を1文ずつに分解するのに標記の方法を試したので、メモとして。
やりたいこと
例えば、次のような文章を1文ずつに分解したい。
明日、銀座でランチしましょう。イタリアンはどうですか?おすすめの店があるのですが。今日の夜までに返事くださいね!電話でもメールでもOKです。
これをGiNZAで簡単にできそうでしたのでcolabで試してみました。
内容
従来型モデルを使う方法とtransformer使って性能を向上させたモデルを使う方法の2種があるようです。後者の方が誤りが少ないようですが、その分、モデルのダウンロードやGPU環境の準備(ただしCPUでも出来る)などがあるので、実行するハードルがちょっと上がります。
GiNZA + 従来型モデルを試す。
!pip install ginza ja_ginza
import spacy
nlp = spacy.load('ja_ginza')
doc = nlp('明日、銀座でランチしましょう。イタリアンはどうですか?おすすめの店があるのですが。今日の夜までに返事くださいね!電話でもメールでもOKです。')
for sent in doc.sents:
print(sent)
結果は下記になりました。
明日、銀座でランチしましょう。
イタリアンはどうですか?
おすすめの店があるのですが。
今日の夜までに返事くださいね!
電話でもメールでもOKです。
GiNZA + Transformersモデルを試す
公式ページによるとメモリ16GB以上必要とのこと。
!pip install -U ginza ja_ginza_electra
!pip install -U ginza https://github.com/megagonlabs/ginza/releases/download/latest/ja_ginza_electra-latest-with-model.tar.gz
# GPUを使う場合。CPUで実行したい場合は下記は実行しないこと
!pip install -U "spacy[cuda110]"
import spacy
nlp = spacy.load('ja_ginza')
doc = nlp('明日、銀座でランチしましょう。イタリアンはどうですか?おすすめの店があるのですが。今日の夜までに返事くださいね!電話でもメールでもOKです。')
for sent in doc.sents:
print(sent)
GPU実行時の結果は下記になりました。
明日、銀座でランチしましょう。
イタリアンはどうですか?
おすすめの店があるのですが。
今日の夜までに返事くださいね!
電話でもメールでもOKです。
CPU実行時の結果は下記になりました。ワーニングが出ますが同じように結果はでます。
/usr/local/lib/python3.7/dist-packages/torch/amp/autocast_mode.py:198: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling
warnings.warn('User provided device_type of \'cuda\', but CUDA is not available. Disabling')
明日、銀座でランチしましょう。
イタリアンはどうですか?
おすすめの店があるのですが。
今日の夜までに返事くださいね!
電話でもメールでもOKです。
所感など
- 「従来型」はライブラリもそこまで不要で、CPU環境でも実行でき、実行に重いデータのダウンロードが不要なため、気軽に試せる。
- 一方で「GiNZA + Transformersモデル」はモデルのサイズが圧縮ファイルで800MB近くもあり、メモリも16GBバイト以上必要など実行のハードルが少しだけある印象。長文で実施した場合、文書量が多いとき、トークンまで分解するときなどは、「GiNZA + Transformersモデル」でGPU活用が良さそうですが、近いうちに多いデータ量で試してみたい。
参考
実行環境