Pythonで文字列処理〜大文字小文字全組み合わせを作る

f:id:massox:20210220201223p:plain

記事の内容

タイトルどおり

背景

オンラインコミュニティで(NLPに関するプロジェクトでの)専門用語の辞書作りどうやって楽にできるかなぁって話がきっかけ。

(簡単な)表記ゆれぐらいなら吸収できそうですよね、という話になった。

機能

入力文字列の大文字小文字の全パターンを作成し、リストとして返す。

実装

Google Colab で動かす

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

結果のイメージ

f:id:massox:20210220202642p:plain

所感

  • itertools で順列組み合わせを計算している
    • 話によると more-itertools という便利なやつがあるらしい
  • 今回の実装は再帰で書くともっとスマートに実装できたはず
  • 計算の効率がすごく悪いので、文字列の10文字ぐらい超えるとColab上ではメモリが足りなくなる(クラッシュする)
  • n文字の計算時間は、O(n!)なので、こんなものを仕事で使うわけには行かない😇😇😇