読者です 読者をやめる 読者になる 読者になる

09 : 言語処理100本ノックでPythonのお勉強

第一章 : 09 Typoglycemia

スペースで区切られた単語列に対して,各単語の先頭と末尾の文字は残し,それ以外の文字の順序をランダムに並び替えるプログラムを作成せよ.ただし,長さが4以下の単語は並び替えないこととする.適当な英語の文(例えば"I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind .")を与え,その実行結果を確認せよ.

Typoglycemiaとは、ニコニコ大百科に以下の用に書かれている。

Typoglycemiaとは、単語を構成する文字を並べ替えても、最初と最後の文字が合っていれば読めてしまう現象のことである。
[例え]
こんちには みさなん おんげき ですか? わしたは げんき です。 この ぶんょしう は いりぎす の ケブンッリジ だがいく の けゅきんう の けっか にんんげ は もじ を にしんき する とき その さしいょ と さいご の もさじえ あいてっれば じばんゅん は めくちちゃゃ でも ちんゃと よめる という けゅきんう に もづいとて わざと もじの じんばゅん を いかれえて あまりす。 どでうす? ちんゃと よゃちめう でしょ? ちんゃと よためら はのんう よしろく

文字が入れ替わっていてもなんか読めちゃいますね。これは欧米人が英語を読んでも同様のようです。 今回のプログラムはTypoglycemiaに変換する関数を書きます。 プログラムはこのような感じになりました。

import random

def typoglycemia(sentence):
    result_list = []
    sentence_list = sentence.split(' ')
    for i in range(len(sentence_list)):
        if len(sentence_list[i]) > 4:
            word = sentence_list[i]
            first = word[0]
            last = word[-1]
            middle = word[1:-1]
            rand_middle = random.sample(middle, len(middle))
            rand_middle = ''.join(rand_middle)
            word = first + rand_middle + last
            result_list.append(word)
        else:
            result_list.append(sentence_list[i])
    result_sentence = ' '.join(result_list)
    return result_sentence

l = "I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind ."
print(typoglycemia(l))

上の書き方はいろいろ微妙なので、ネットで調べた内容を参考に以下のように書き換えました。

import random

def typoglycemia(sentence):
    '''
    param : 対象の文字列
    return : 変換した文字列
    '''
    result = []
    for word in sentence.split(' '):
        if len(word) <= 3:
            result.append(word)
        else:
            w_list = list(word[1:-1])
            random.shuffle(w_list)
            result.append(word[0] + ''.join(w_list) + word[-1])

    return ' '.join(result)

target = input('文字列を入力してください。\n')

result = typoglycemia(target)
print('変換結果\n' + result)

こちらを参考にしました。というかほぼ同じです。ありがとうございました。

素人の言語処理100本ノック:09 - Qiita