문자열 구분 일치율 계산 [python]

개요



컷이 존재하는 두 개의 문자열에서 컷의 위치가 얼마나 일치하는지를 계산하는 프로그램을 작성했습니다.
「00으로 노래해 보았다」라고 하는 장르의 바꾸어 노래에 있어서, 본래의 가사의 절절의 조각과 바꾸어 가사의 단어의 조각이 어느 정도 일치하고 있는지를 조사하기 위해서 만들었습니다.

배경



「00으로 노래해 보았다」는 특정 카테고리의 명사만으로 본래의 가사의 발음을 재현하도록(듯이) 노래된 바꾸어 노래입니다. 아래 그림은 동요 『고향』의 가사를 역명으로 대체한 「00으로 노래해 보았다」의 예입니다.

「00으로 노래해 보았다」에서는 바꿔 가사의 단어의 틈과 본래의 가사의 문절의 틈이 어느 쪽인가라고 하면 일치하도록 만들어지는 경향이 있습니다. 이유는 확실하지 않지만, 하나는 그 쪽이 노래하기 쉽기 때문이라는 이유가 생각됩니다. 몇몇 대체 노래에 있어서, 어느 정도 일치하고 있는지를 조사하고 싶어졌으므로, 2개의 문장의 문절 일치율을 평가하는 프로그램을 써 보기로 했습니다.

풀고 싶은 문제



문자열 A와 문자열 B가 주어져 두 개의 절 일치율을 구하는 것이 목표입니다.

입력



간단하기 위해 두 문자열의 Moura 수는 동일합니다. 또 발음(읽는 방법)과 문절(단어)의 틈은 기지로 합니다. 발음은 가타카나로, 절의 구분은 슬래시로 표기하는 것으로 합니다. 예를 들어 다음과 같은 문자열을 입력으로 가정합니다.
  • 문자열 A (대체 노래 가사) : 갈매기/갈매기/카구/나가노 고리/코뿔소/쿠이/츠미/쥐/소/당나귀/표범/메나다/아비
  • 문자열 B(본래의 가사): 카고메/카고메/카고노/나카노/토리와/이츠/이츠/데아타/우시로노/쇼우멘/다아레

  • 출력



    문자열 A와 문자열 B의 절 일치율을 출력합니다.
    문장 일치율은 문자열 A의 절의 구분 중 문자열 B의 절의 구분과 같은 위치에 있는 비율과 정의합니다. 같은 위치일지 어떨지는, 그 절의 단락의 직전까지 존재하는 캐릭터 라인의 모우라수로 판단합니다. 또한 문자열의 끝은 절의 구분으로 간주되지 않습니다. 예를 들면 앞서 나타낸 카고메의 예로, 문자열 B 중 일치하는 틈을 더블 쿼테이션으로 나타내면 이하가 됩니다.
  • 스트링 A(대체 가사):갈매기"/"갈매기"/"카구"/"나가노고리/싸이/퀴/트미/쥐"/"소/당나귀"/"표범/메나다/아비
  • 문자열 B(본래의 가사): 카고메/카고메/카고노/나카노/토리와/이츠/이츠/데아타/우시로노/쇼우멘/다아레

  • 문자열 B의 절의 구분의 수(=슬래시의 수)는 12로, 그 중 문자열 A의 절의 구분과 일치하고 있는 것은, 5개입니다. 글자수가 아닌 모우라수(예를 들면 효는 2문자입니다만, 1모우라입니다)로 세는 것에 주의해 주세요.

    환경



    macOS Catalina 10.15.7
    파이썬 3.8.0

    코드



    주어진 문자열을 모우라 단위로 분해한 다음 슬래시의 위치를 ​​계산합니다.
    import re
    
    #各条件を正規表現で表す
    c1 = '[ウクスツヌフムユルグズヅブプヴ][ヮァィェォ]' #ウ段+「ヮ/ァ/ィ/ェ/ォ」
    c2 = '[イキシシニヒミリギジヂビピ][ャュェョ]' #イ段(「イ」を除く)+「ャ/ュ/ェ/ョ」
    c3 = '[テデ][ャィュョ]' #「テ/デ」+「ャ/ィ/ュ/ョ」
    c4 = '[ァ-ヴー]' #カタカナ1文字(長音含む)
    
    cond = '('+c1+'|'+c2+'|'+c3+'|'+c4+')'
    re_mora = re.compile(cond)
    
    #カタカナ文字列をモウラ単位に分割したリストを返す
    def mora_wakachi(kana_text):
        return re_mora.findall(kana_text)
    
    
    def phrase_partition_concordance(text1, text2):
      partition = "/"
      #文字列を区切り文字でスプリット
      kana_list1 = text1.split(partition)
      kana_list2 = text2.split(partition)
      #各要素をモウラに分割
      kana_list1 = [mora_wakachi(k) for k in kana_list1]
      kana_list2 = [mora_wakachi(k) for k in kana_list2]
    
      #text1の文節位置を取得
      partition_position1 = [0]
      for k in kana_list1:
        pos = partition_position1[-1] + len(k)
        partition_position1.append(pos)
      #最初と最後は文節位置から除く
      partition_position1 = partition_position1[1:-1]
    
      #text2の文節位置を取得
      partition_position2 = [0]
      for k in kana_list2:
        pos = partition_position2[-1] + len(k)
        partition_position2.append(pos)
      #最初と最後は文節位置から除く
      partition_position2 = partition_position2[1:-1]
    
      #text1の文節位置がtext2の文節位置に含まれるかチェック
      same_pos_num = 0
      for p in partition_position1:
        if p in partition_position2:
          same_pos_num += 1
      #text1の文節の切れ目の数
      partition_num = len(partition_position1)
      return same_pos_num / partition_num
    
    text1 = "カモメ/カモメ/カグー/ナガノゴリ/サイ/クイ/ツミ/ラット/ウシ/ロバ/ヒョウ/メナダ/アビ"
    text2 = "カゴメ/カゴメ/カゴノ/ナカノ/トリワ/イツ/イツ/デアッタ/ウシロノ/ショウメン/ダアレ"
    
    print(phrase_partition_concordance(text1,text2))
    

    좋은 웹페이지 즐겨찾기