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

  • 2
    Like
  • 3
    Comment

言語処理100本ノック 2015の挑戦記録です。環境はUbuntu 16.04 LTS + Python 3.5.2 :: Anaconda 4.1.1 (64-bit)です。過去のノックの一覧はこちらからどうぞ。

(2016/09/19更新)
shiracamusさんよりアドバイス頂き、一部コードを修正しました。ありがとうございます!

第1章: 準備運動

09.Typoglycemia

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

出来上がったコード:

main.py
# coding: utf-8
import random


def Typoglycemia(target):
    '''タイポグリセミア
    スペースで区切られた単語列に対して、各単語の先頭と末尾の文字は残し、
    それ以外の文字の順序をランダムに並び替える。
    ただし、長さが4以下の単語は並び替えない。

    引数:
    target -- 対象の文字列
    戻り値:
    変換した文字列
    '''
    result = []
    for word in target.split(' '):
        if len(word) <= 4:
            result.append(word)
        else:
            chr_list = list(word[1:-1])
            random.shuffle(chr_list)
            result.append(word[0] + ''.join(chr_list) + word[-1])

    return ' '.join(result)

# 対象文字列の入力
target = input('文字列を入力してください--> ')

# タイポグリセミア
result = Typoglycemia(target)
print('変換結果:' + result)

実行結果:

端末
文字列を入力してください--> I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind .
変換結果:I c'udnlot bievele that I colud aclautly utaedsrnnd what I was rainedg : the penomaenhl power of the human mind .

乱数の生成ロジック

ランダムな並び替えはrandom.shuffle()を使いました。この関数では並び替えに使う乱数の生成関数を指定することもできますが、今回は省略しているのでrandom.random()が使われます。この場合の生成ロジックはメルセンヌ・ツイスタとのこと。デフォルトで優秀な乱数が生成されるのはうれしいですね。

なお、randomモジュールの解説にも警告がありますが、このロジックで生成される乱数は予測可能になるので、暗号化の目的でそのまま利用するのは危険とのことです。ご注意を。

タイポグリセミア

間違っているのになんとなく読めてしまうタイポグリセミアという現象、なかなか面白いです。ただ問題なのは、英語が苦手だとスペルが正確でもなんとなくしか読めないこと...

というわけで日本語でも試してみました。
日本語の場合は4文字でも並び替えて大丈夫とのことなので、「長さが4以下」を「長さが3以下」に変えたバージョンです。

出来上がったコード:

main2.py
# coding: utf-8
import random


def Typoglycemia(target):
    '''タイポグリセミア【日本語バージョン】
    スペースで区切られた単語列に対して、各単語の先頭と末尾の文字は残し、
    それ以外の文字の順序をランダムに並び替える。
    ただし、【長さが3以下】の単語は並び替えない。

    引数:
    target -- 対象の文字列
    戻り値:
    変換した文字列
    '''
    result = []
    for word in target.split(' '):
        if len(word) <= 3:
            result.append(word)
        else:
            chr_list = list(word[1:-1])
            random.shuffle(chr_list)
            result.append(word[0] + ''.join(chr_list) + word[-1])

    return ' '.join(result)

# 対象文字列の入力
target = input('文字列を入力してください--> ')

# タイポグリセミア
result = Typoglycemia(target)
print('変換結果:' + result)

実行結果:

端末
文字列を入力してください--> わたしは さいきん ぱいそん の べんきょう を はじめ ましたが なかなか おもしろい ですね
変換結果:わしたは さきいん ぱいそん の べんょきう を はじめ またしが なかなか おしもろい ですね

日本語の場合は、ひらがなにして適当に空白も入れないといけませんが、なんとなく理解できる内容になりました。

 
じっんぽゅめ の のっくは いょじう です。 あまやり など あしまりたら ごしどう いけますだたと さいわい です^^