LoginSignup
4

More than 1 year has passed since last update.

テキストの前処理

Last updated at Posted at 2023-01-18

はじめに

自然言語処理をする際、テキストの正規化、日本語の前処理を行う必要があります。
それを行うPythonのコードが出回っていたのですが、それがあまりにもひどかったので戦慄しました。
おそらくこちらが発端だと思うのですが、よりよいコードで塗り替えたいと思うに至りました。

結論

import re
import unicodedata

OTHERTRANS = str.maketrans(
    '’”‘。、',
    '\'"`.,'
)

CTRLCHAR_PATTERN = re.compile('[\u0000-\u001F]')
SAPCE_PATTERN = re.compile(r"\s+")
HYPHEN_PATTERN = re.compile('[˗֊‐‑‒–⁃⁻₋−]+')
CHOONPU_PATTERN = re.compile('[﹣-ー—―─━ー]+')
TILDE_PATTERN = re.compile('[~∼∾〜〰~]+')

JP_PATTERN = '[\u3040-\u309F\u30A0-\u30FF\u4E00-\u9FFF]'
LA_PATTERN = '[\u0021-\u007E]'
EXTRA_SPACE_PATTERNS = [
    re.compile(f"({JP_PATTERN}) ({JP_PATTERN})"),
    re.compile(f"({LA_PATTERN}) ({JP_PATTERN})"),
    re.compile(f"({JP_PATTERN}) ({LA_PATTERN})"),
]

def normalize_text(text):
    text = unicodedata.normalize('NFKC', text)
    text = text.translate(OTHERTRANS)

    text = CTRLCHAR_PATTERN.sub(' ', text)
    text = SAPCE_PATTERN.sub(' ', text)
    text = HYPHEN_PATTERN.sub('-', text)
    text = CHOONPU_PATTERN.sub('', text)
    text = TILDE_PATTERN.sub('~', text)

    for extra_space_pattern in EXTRA_SPACE_PATTERNS:
        text = extra_space_pattern.sub(r"\1\2", text)
    
    text = text.lower()

    return text

おわりに

コメント欄で議論することによって、よりよく改善していければと思います。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4