🤗

Hugging Faceのtransformersライブラリで日本語QAタスクを試す

2022/11/30に公開

はじめに

SREホールディングス株式会社エンジニアの木下です。

データサイエンス専門チームでなくてもAIモデルを試してみるような場合に簡単に利用できるHugging Faceのtransformersライブラリを使って、日本語QAタスクを試した例をご紹介します。

Hugging Faceのサイトでタスクと言語から試してみたいモデルを探し、手元の環境でモデルとトークナイザを指定するだけで準備は完了です。サンプルとして、不動産サイトのテキスト情報をコンテキストとして与えて物件価格や駅距離が答えられるか試してみます。

対象読者

  • transformersライブラリを使ったことがなく、ざっくりと使い方を概観したい方

Hugging Faceで試してみたいモデルを決める

Hugging Faceは、自然言語処理や音声認識などの学習済みモデルや学習に使える各種データがホストされているプラットフォームです。本記事執筆時点(2022年11月21日)で90,016もの学習済みモデルが公開されています。

サイト内のモデル一覧ページで試してみたいタスクと言語を指定するとモデルを絞り込むことができます。ここでは「Tasks」(タスク)に「Question Answering」、Languages(言語)に「Japanese」を選んで絞り込んだモデルの中から「KoichiYasuoka/bert-base-japanese-wikipedia-ud-head」を使用してみます。
(https://huggingface.co/KoichiYasuoka/bert-base-japanese-wikipedia-ud-head)

モデルとトークナイザを指定する

transformersライブラリでは、先ほどのモデル名とAutoModelやAutoTokenizerなどの仕組みを使って、モデルやトークナイザをロードする事ができます。

>>> from transformers import AutoTokenizer
>>> from transformers import AutoModelForQuestionAnswering
>>> model_name = 'KoichiYasuoka/bert-base-japanese-wikipedia-ud-head'
>>> tokenizer = AutoTokenizer.from_pretrained(model_name)
>>> model = AutoModelForQuestionAnswering.from_pretrained(model_name)

これでロードは完了です。

pipelineというラッパーにtokenizerとmodelを指定すればモデル側の準備は完了です。

>>> from transformers import QuestionAnsweringPipeline
>>> qap = QuestionAnsweringPipeline(tokenizer=tokenizer, model=model)

コンテクストに与えるサンプルを準備する

QAタスクではコンテクスト(context)に背景知識となるような文章を与えた上で、質問に対する回答を得ることになります。

コンテクストのサンプルとして不動産サイトの物件情報を与えるため、ページ内容の取得し簡単に整形を行ってみます。

>>> import re
>>> import requests
>>> import unicodedata
>>> from bs4 import BeautifulSoup

ページ内容を取得してみます。

>>> url = # 不動産サイトのURL
>>> res = requests.get(url)

簡単なHTML解析で物件情報のテキスト部分を取得します。

>>> soup = BeautifulSoup(res.text, 'html.parser')
>>> text = soup.find(<条件>) # 範囲を絞り込んでもよい

簡単に整形してみます。

>>> text = unicodedata.normalize('NFKD', text)
>>> text = re.sub('[\r\t\n]+', ' ', text)
>>> text = text[:2048] 

このテキストをコンテクストに与えて日本語QAタスクを試してみます。

日本語QAタスクを試してみる

QAタスクを試すには、上記で作成したパイプラインにコンテクスト(context)と質問(question)を与えます。
質問としては物件価格と駅距離に関する質問を与えてみます。該当の物件には最寄り駅が2つ指定されているので、それぞれの駅に対して質問を試してみます。

>>> qap(
    context=text,
    question='物件価格は?'
)
{'score': 0.9969870448112488, 'start': 1104, 'end': 1110, 'answer': '9580万円'}
>>> qap(
    context=text,
    question='勝どき駅まで何分?'
)
{'score': 0.9914627075195312, 'start': 817, 'end': 819, 'answer': '6分'}
qap(
    context=text,
    question='月島駅まで何分?'
)
{'score': 0.9930899739265442, 'start': 845, 'end': 848, 'answer': '17分'}

まとめ

transformersライブラリを使って簡単に日本語QAタスクを試した例をご紹介しました。自然言語処理にとどまらず、音声認識やコンピュータ・ビジョン関係のタスクも試してみることができ、また、ファインチューニングも簡単に試すことができますので、積極的に活用していきたいところです。

SRE Holdings 株式会社

Discussion