医師国家試験をデータベース化する(2)

今度は、第117回医師国家試験 A 問題の選択肢をデータベース化します。

pdf からテキストを抽出してある程度整形する

これは前回に作成したものを使います。ただし、選択肢は削除しないようにします。


    def delchoice( self ):
        self.totaltxt = re.sub(r'DKIX-01-AH-\d{,2}\n\d{1,2}\n', '', self.totaltxt)
        self.totaltxt = re.sub( r'別 冊\n.+\n', '', self.totaltxt )
        self.totaltxt = re.sub(r'(\d+) (.*)', r'問題\1----\2', self.totaltxt)                
        self.totaltxt = re.sub('([あ-んア-ン一-龥ー])\s+((?=[あ-んア-ン一-龥ー]))', r'\1\2', self.totaltxt)
        self.totaltxt = re.sub( r'\n', '', self.totaltxt )
        self.totaltxt = re.sub( r'(問題\d.*?)(?=(問題\d))', r'\1\n', self.totaltxt)

これを実行すると、次のようなテキストになります。

問題1—-母体背景と胎児疾患の組合せで正しいのはどれか。 3 つ選べ。a 高齢妊娠    13trisomyb 風疹感染先天性心疾患c 妊娠高血圧症候群不整脈d 全身性エリテマトーデス頭蓋内出血e パルボウイルス B19 感染貧血
問題2—-アレルギー性鼻炎の診断で原因抗原を特定するために行う検査はどれか。 2 つ選べ。a プリックテストb 鼻汁好酸球検査c 血清総 IgE 検査d 末梢血好酸球数測定e 血清特異的 IgE 検査
問題3—-胃全摘術後にみられる可能性があるのはどれか。 3 つ選べ。a 胆石b 肥満c 貧血d 耐糖能異常e 門脈圧亢進

問題番号と選択肢だけを抽出する

上のようにして作成されたテキストから不必要なもの(黄色い部分)を取り除きます。

問題1—-母体背景と胎児疾患の組合せで正しいのはどれか。 3 つ選べ。a 高齢妊娠    13trisomyb 風疹感染先天性心疾患c 妊娠高血圧症候群不整脈d 全身性エリテマトーデス頭蓋内出血e パルボウイルス B19 感染貧血
問題2—-アレルギー性鼻炎の診断で原因抗原を特定するために行う検査はどれか。 2 つ選べ。a プリックテストb 鼻汁好酸球検査c 血清総 IgE 検査d 末梢血好酸球数測定e 血清特異的 IgE 検査
問題3—-胃全摘術後にみられる可能性があるのはどれか。 3 つ選べ。a 胆石b 肥満c 貧血d 耐糖能異常e 門脈圧亢進


self.totaltxt = re.sub( r'(問題\d+----).+(?=a )', r'\1', self.totaltxt ) 

「(?=a )」は肯定の先読みというもので、全角の a と全角スペースが現れるまでの文字列という意味です。

(問題\d+—-)とすると 1 番めにキャプチャされるので、問題\d+—-から始まって、全角の a と全角スペースが現れるまでの文字列になります。それを、問題\d+—で置換しているので、要するに問題\d+—と a と全角スペースで挟まれた部分が脱落します。

次にそのテキストから、次の様な辞書を作成します。python の辞書というのは連想配列です。

[{‘qnum’: ‘問題1’, ‘a’: ‘高齢妊娠    13trisomy’, ‘b’: ‘風疹感染先天性心疾患’, ‘c’: ‘妊娠高血圧症候群不整脈’, ‘d’: ‘全身性エリテマトーデス頭蓋内出血’, ‘e’: ‘パルボウイルス B19 感染貧血’},
{‘qnum’: ‘問題2’, ‘a’: ‘プリックテスト’, ‘b’: ‘鼻汁好酸球検査’, ‘c’: ‘血清総 IgE 検査’, ‘d’: ‘末梢血好酸球数測定’, ‘e’: ‘血清特異的 IgE 検査’},
{‘qnum’: ‘問題3’, ‘a’: ‘胆石’, ‘b’: ‘肥満’, ‘c’: ‘貧血’, ‘d’: ‘耐糖能異常’, ‘e’: ‘門脈圧亢進’}

python は、


    def createdic( self ):       
        elar = self.totaltxt.split('\n')        
        for eline in elar:
            qn = re.match(r'問題\d+', eline)
            al = re.findall(r'[a-z] .+?(?=[a-z]|$)', eline)      
            if qn:
                mc_dict = {'qnum': qn[0]}               
                for el in al:
                    key = re.match(r'(^[a-z])', el)
                    value = re.sub(r'([a-z]) ', '', el)
                    mc_dict[key[0]] = value
                for missing_key in ['f', 'g', 'h']:
                    mc_dict.setdefault(missing_key, '')       
                self.choice_list.append(mc_dict)

データベースへの書き込み

辞書を以下の python で mysql に書き込みます。


     def insertDB( self ):
        connection = mysql.connector.connect(
            host = "localhost",
            user = self.username,
            password = self.password,
            database= self.mysqldb
        )
        cursor = connection.cursor()
        insert_query = "INSERT INTO your_table (qnum, a, b, c, d, e, f, g, h) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)"
        cursor.executemany(insert_query, [(item['qnum'], item['a'], item['b'], item['c'], item['d'], item['e'], item['f'], item['g'], item['h']) for item in self.choice_list])  
        connection.commit()      
        cursor.close()
        connection.close()