Pythonで文字列処理〜大文字小文字全組み合わせを作る
記事の内容
タイトルどおり
背景
オンラインコミュニティで(NLPに関するプロジェクトでの)専門用語の辞書作りどうやって楽にできるかなぁって話がきっかけ。
(簡単な)表記ゆれぐらいなら吸収できそうですよね、という話になった。
機能
入力文字列の大文字小文字の全パターンを作成し、リストとして返す。
実装
import itertools def get_unique_list(seq): seen = [] return [x for x in seq if x not in seen and not seen.append(x)] def case_ch_flgs(input_text: str="") -> list: if input_text == "": return None ch_flgs = [] tl = len(input_text) for i in range(tl): flg = [1] * (i+1) flg.extend( [0] * (tl - i - 1) ) flg_prm = list(itertools.permutations(flg)) flg_prm = get_unique_list(flg_prm) ch_flgs.extend(flg_prm) return ch_flgs def text_data_augmer(input_text: str="") -> list: """テキストデータ拡張 """ if input_text == "": return None # 大文字小文字の全組み合わせを作る ch_flgs = case_ch_flgs(input_text) _lower = input_text.lower() _lower_chrs = [c for c in _lower] # 全組み合わせの文字列リストを作る aug_text_arr = [] for ch_flg in ch_flgs: _aug_text = [c.upper() if f == 1 else c for f, c in zip(ch_flg, _lower_chrs)] aug_text_arr.append(''.join(_aug_text)) return aug_text_arr
結果のイメージ
所感
itertools
で順列組み合わせを計算している- 話によると
more-itertools
という便利なやつがあるらしい
- 話によると
- 今回の実装は再帰で書くともっとスマートに実装できたはず
- 計算の効率がすごく悪いので、文字列の10文字ぐらい超えるとColab上ではメモリが足りなくなる(クラッシュする)
- n文字の計算時間は、O(n!)なので、こんなものを仕事で使うわけには行かない😇😇😇