ニュース

2034年09月29日

【自然言語処理】事前学習モデルを用いる際の適切な前処理

昨今、大規模言語モデルが流行っていますね。私たちは公開されている事前学習済みのモデルを独自に転移学習し、業務利用可能なモデルの開発を行っています。

その際に、適切なデータの前処理を行うために気をつけていることを共有します!

前処理のポイント

本記事で触れる前処理の前提となるポイントは、

データの語彙を事前学習済みモデルの語彙にできるだけ近づける

ことです!つまり、用いるモデルが学習しているデータに近づくようにデータを前処理を行うことで性能の向上が見られるということです。

以下では、このポイントに重点を置いた上で各処理について説明します。

記号の処理

モデルを事前学習する際には、記号を削除していることが多いです。

そのようなモデルに適応するために、転移学習で用いるデータの記号も同様に処理します。

以下に、Pythonを用いて記号を適切に削除・置換するコード例を示します。

def clean_text(x):
    x = str(x)
    for punct in "/-'":
        x = x.replace(punct, ' ')
    for punct in '&':
        x = x.replace(punct, f' {punct} ')
    for punct in '?!.,"#$%\'()*+-/:;<=>@[\\]^_`{|}~' + '“”’':
        x = x.replace(punct, '')
    return x

このコードは一例であることに注意してください。例えば、日本語のデータを扱う際には、全角記号なども置換する必要があります。あくまで、使うデータとモデルに合わせて前処理を実装することが重要です。

数字の処理

事前処理の際に"23"などの数字を"##"のように置き換えているモデルが多いです。そのため、それに合わせて数字を置き換えることが効果的です。

この処理を行うと、モデルから数字が出力されないことに注意する必要があります。


以下のような実装でこの処理は行えます。

import re

def clean_numbers(x):
    x = re.sub('[0-9]{5,}', '#####', x)
    x = re.sub('[0-9]{4}', '####', x)
    x = re.sub('[0-9]{3}', '###', x)
    x = re.sub('[0-9]{2}', '##', x)
    return x

この処理も、記号の処理と同様に、事前学習済みモデルで行われている前処理に合わせて実装することが大切です。

綴りの処理

英語の文章では特に、地域によって綴りが変わることがあります(アメリカ英語とイギリス英語など)。このような場合には、モデルが学習している綴りに合わせることが重要です。

また、固有名詞などを一般名詞に置き換えることは非常に効果的です。


日本語だと半角全角の違いや、送り仮名や異体字などが考えられます。

以下では、英語の綴りを統一するコード例を示します。

def _get_mispell(mispell_dict):
    mispell_re = re.compile('(%s)' % '|'.join(mispell_dict.keys()))
    return mispell_dict, mispell_re

mispell_dict = {
  'colour':'color',
  'centre':'center',
  'didnt':'did not',
  'doesnt':'does not',
  'isnt':'is not',
  'shouldnt':'should not',
  'favourite':'favorite',
  'travelling':'traveling',
  'counselling':'counseling',
  'theatre':'theater',
  'cancelled':'canceled',
  'labour':'labor',
  'organisation':'organization',
  'wwii':'world war 2',
  'citicise':'criticize',
  'instagram': 'social medium',
  'whatsapp': 'social medium',
  'snapchat': 'social medium'
 }
mispellings, mispellings_re = _get_mispell(mispell_dict)

def replace_typical_misspell(text):
    def replace(match):
        return mispellings[match.group(0)]

    return mispellings_re.sub(replace, text)

まとめ

この記事では、事前学習済みモデルの語彙にデータを合わせるという観点に着目して、前処理のいくつかの手法を解説してきました。最後までお読みいただきありがとうございます!

参考

https://www.kaggle.com/code/christofhenkel/how-to-preprocessing-when-using-embeddings

著者の画像

平田 蓮