Memorandum

Python勉強中 基本的に覚書

ランダムに作成したテキストファイルに共通するパターンが複数存在する場合に何種類の文字から構成されていればパターンの数が安定するか

実際に行った事柄を最初に箇条書きでまとめておく。

・random moduleで使用する文字の種類(数)を限定した上で全体の文字数を揃えたファイルを複数作成

・作成したファイル中に同じパターンが2回以上出た場合にその数を数える

まず、ランダムな文字ファイルの作成プログラム。

#! /usr/bin/env python
# -*- coding:utf-8 -*-

import random

user_in = raw_input("What numbers do you like?: ")
text = ''
 
for i in range(int(user_in)):
     r = random.choice("ABCDEFGHI")
     text += str(r)
f = open("text_" + str(user_in) + ".txt", "w")
f.write(text)
f.close()

choiceメソッドで取得しているアルファベット数を変更する(ユーザーの入力で文字の種類を変更するようにすればよかった)。 今回は文字の種類の数を5, 6, 7, 8, 9, 10, 15, 20として8ファイル作成した。

次に作成したファイルに対して2回以上ヒットするパターンの検出プログラム。

#! /usr/bin/env python
# -*- coding:utf-8 -*-

import sys

temp = ''
filename = sys.argv[1]
inputfile = open(filename, 'r')

user_in_min = raw_input("min text length: ")
user_in_max = raw_input("max text length: ")

text_list = {}
result = ''
count = 0

for line in inputfile:
    temp = line.rstrip()
    for k in range(int(user_in_min), int(user_in_max) + 1):
        for i in range(len(temp)):
            if (int(i) + int(k)) <= len(temp):
                if text_list.has_key(temp[i:i+k+1]):
                    text_list[temp[i:i+k+1]] += 1
                else:
                    text_list[temp[i:i+k+1]] = 1

for u in sorted(text_list.keys(), key = lambda x: len(x)):
    if int(text_list[u]) >= 2:
        count += 1
        result += str(u) + "\t" + str(text_list[u]) + "\n"
result += str(count) + "\n"
inputfile.close()
name = str(filename).split(".txt")[0]
f = open(str(name) + "_result.txt", "w")
f.write(result)
f.close()

パターンの長さはユーザー指定ではあるが今回全て5〜20の範囲で探した。

(user_in_min = 5, usr_in_max = 20)

結果として、

文字の種類:2回以上ヒットしたパターンの数
572
635
718
823
916
1015
1515
2015

パターンマッチのプログラムを見ればわかるが重複を許しているので 短いマッチは長いものに含まれていることが考えられるため 重複を許容しなければもっと数が減って文字の種類がもう少し少ない段階から 2回以上ヒットするパターンの数が一定になるかもしれない。 文字の総数とパターンの長さを変更してもう少し細かく見れば 何かよくわからないが見えるかも...しれない......。

モッピー!お金がたまるポイントサイト