end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

Hugging Face Transformers Pipelines の日本語文章生成の練習

これまで利用したことがありませんでしたので、google colab で練習

目次

参考url

pip install

!pip install transformers
!pip install sentencepiece

sentencepiece (Tokenizer)とは

SentencePiece 入門|npaka によれば

「SentencePiece」は、テキストを「サブワード」に分割するツールです。

「自然言語処理」の深層学習を行うには、テキストを何かしらの「トークン」に分割し、
それを「ベクトル表現」に変換する必要があります。

以前は、「MeCab」の形態素解析を使ってテキストを「単語」に分割するのが一般的でした。
しかし「単語」を使うのは実用上の問題点があります。語彙数が膨大になり、
高頻度語彙のみに限定したとしても、低頻度語彙が捨てられ未知語として
扱われることになります。

「SentencePiece」では「サブワード」を使ってこの問題を解決しています。
はじめに、テキストを単語に分割し、各単語の頻度を求めます。
次に、高頻度単語は1語彙として扱い、低頻度単語はより短い語彙に分割します。
そして、語彙数が事前に指定した数になるまで、分割を繰り返します。
これによって、語彙数を小さくしつつ、未知語をなくすことを可能にしています。

らしい

Pipelines python script

from transformers import pipeline, set_seed
# https://huggingface.co/docs/transformers/main_classes/pipelines
# https://huggingface.co/gpt2
# https://huggingface.co/rinna/japanese-gpt2-small
# generator = pipeline('text-generation', model='gpt2')
generator = pipeline('text-generation', model='rinna/japanese-gpt2-small')
set_seed(42)
generator("東京都国分寺市は、", max_length=30, num_return_sequences=5)
#generator("Hello, I'm a language model,", max_length=30, num_return_sequences=5)

↑こう書くと、↓こう表示されます

Setting `pad_token_id` to `eos_token_id`:2 for open-end generation.
[{'generated_text': '東京都国分寺市は、埼玉県における人口で2番目に多い自治体である。 国分寺市の市域面積が1. 0平方キロメートルであるが、埼玉県では、'},
 {'generated_text': '東京都国分寺市は、東京都のほぼ中央に位置し、都と市の中間に位置する。 また国分寺市内には、jr東日本中央線や東北本線が通る。'},
 {'generated_text': '東京都国分寺市は、市内の市町村と政令指定都市の市町との合併による市町村合併による市制移行が行われた。 国分寺市は、東京都の多摩'},
 {'generated_text': '東京都国分寺市は、全国に先駆けて市制を施行し、1971年(昭和46年)5月1日市制施行となりました。これは1975年('},
 {'generated_text': '東京都国分寺市は、東京23区内において、国分寺市議会による地方自治憲章(政憲議会定例会において議長1名の選出権限をもつ'}]
 

Pipelines を使用しない python script

先程のPipelinesは、1行で様々、処理してくれますが、 同様処理内容は、以下のように記載することもできます。

from transformers import AutoTokenizer, AutoModelForCausalLM

tokenizer = AutoTokenizer.from_pretrained("rinna/japanese-gpt2-small", use_fast=False)
tokenizer.do_lower_case = True  # due to some bug of tokenizer config loading

model = AutoModelForCausalLM.from_pretrained("rinna/japanese-gpt2-small")

prompt = "東京都国分寺市は、"
# return_tensors='pt'により pytorchのtensor型でtokenize
prompt_ids = tokenizer(prompt, return_tensors='pt').input_ids
outputs = model.generate(prompt_ids,
                         do_sample=True,
                         max_length=30,
                         num_return_sequences=5,
                         repetition_penalty=1.1)
tokenizer.batch_decode(outputs,skip_special_tokens=True)

↑こう書くと、↓こう表示されます

The attention mask and the pad token id were not set. As a consequence, you may observe unexpected behavior. Please pass your input's `attention_mask` to obtain reliable results.
Setting `pad_token_id` to `eos_token_id`:2 for open-end generation.
A decoder-only architecture is being used, but right-padding was detected! For correct generation results, please set `padding_side='left'` when initializing the tokenizer.
['東京都国分寺市は、多摩地域の中核都市として昭和40年(1965年)1月に市制施行された。 その後、市内を鉄道路線によって結び',
 '東京都国分寺市は、国分寺市内を南北に走る「国分寺道」が有名で、 国分寺駅 の南口から北口にかけては、',
 '東京都国分寺市は、平成17年(2005)度から、 都市政策学部が「地方独立行政法人多摩センター」に名称変更されたことに伴い、',
 '東京都国分寺市は、鎌倉時代末期に鎌倉よりの町としての町として誕生する。 長禄元年(1229年)源頼朝と',
 '東京都国分寺市は、新宿・江戸川地域からさらに近いことから、国分寺の城下町が広がりました。また、国分寺には古墳などが多く']