まとめ- 「々」「ゝ」「ヽ」などの踊り字(繰り返し記号)を元の文字に展開する。
- Unicodeコードポイントの差分を利用した純粋なPython関数で変換する。
- テキスト検索やキーワードマッチの漏れを防ぎたいときに使う。
「時々」「人々」などの踊り字は、機械的な検索ではヒットしにくい表記です。観測値をすべて漢字に展開しておくと、自然言語処理のステップや単純なフィルタでも漏れを減らせます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| def expand_iteration_marks(text: str) -> str:
result = []
prev_char = ""
for ch in text:
if ch in {"\u3005", "\u303B"} and prev_char:
result.append(prev_char)
elif ch in {"\u309D", "\u309E"} and prev_char:
# ひらがなの繰り返し
base = prev_char
if ch == "\u309E": # ゞ
base = chr(ord(base) + 1)
result.append(base)
elif ch in {"\u30FD", "\u30FE"} and prev_char:
base = prev_char
if ch == "\u30FE": # ヾ
base = chr(ord(base) + 1)
result.append(base)
else:
result.append(ch)
prev_char = ch
return "".join(result)
samples = [
"時々のことなので人々にも共有する",
"くつゝいた靴下",
"サンバゝ←古い仮名遣い",
]
for s in samples:
print(expand_iteration_marks(s))
|
注意点
#
ゝ/ゞ や ヽ/ヾ は歴史的仮名遣いでは濁点を伴う場合があるため、厳密な変換が必要なら辞書を参照して補正します。- 地名や固有名詞に使われる
々 は必ずしも同じ漢字が繰り返されるとは限りません(例: 佐々木)。信頼できる正規化には、辞書やドメイン知識と組み合わせることをおすすめします。