はじめに
自然言語処理をする際、テキストの正規化、日本語の前処理を行う必要があります。
それを行う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
おわりに
コメント欄で議論することによって、よりよく改善していければと思います。