金子邦彦研究室プログラミングRuby プログラミングファイル名とキーワードの入った CSV ファイルを用いたキーワード検索

ファイル名とキーワードの入った CSV ファイルを用いたキーワード検索

ファイルの準備

テキストファイル

◆ ファイル名: a1.txt

第1条 天皇は、日本国の象徴であり日本国民統合の象徴であつて、この地位は、主権の存する日本国民の総意に基く。

◆ ファイル名: a2.txt

第2条 皇位は、世襲のものであつて、国会の議決した皇室典範の定めるところにより、これを継承する。

◆ ファイル名: a3.txt

第3条 天皇の国事に関するすべての行為には、内閣の助言と承認を必要とし、内閣が、その責任を負ふ。

◆ ファイル名: a4.txt

第四条  天皇は、この憲法の定める国事に関する行為のみを行ひ、国政に関する権能を有しない。
○2  天皇は、法律の定めるところにより、その国事に関する行為を委任することができる。 

◆ ファイル名: a5.txt

第五条  皇室典範 の定めるところにより摂政を置くときは、摂政は、天皇の名でその国事に関する行為を行ふ。この場合には、前条第一項の規定を準用する。 

◆ ファイル名: a6.txt

第六条  天皇は、国会の指名に基いて、内閣総理大臣を任命する。
○2  天皇は、内閣の指名に基いて、最高裁判所の長たる裁判官を任命する。 

CSV ファイル

◆ ファイル名: articles.csv

1, a1.txt, 第一条, 第一章 天皇
2, a2.txt, 第二条, 第一章 天皇
3, a3.txt, 第三条, 第一章 天皇
4, a4.txt, 第四条, 第一章 天皇
5, a5.txt, 第五条, 第一章 天皇
6, a6.txt, 第六条, 第一章 天皇

◆ ファイル名: keywords.csv

1, 日本国, にほんこく
2, 天皇, てんのう
3, 国会, こっかい
4, 皇位, こうい
5, 象徴, しょうちょう
6, 主権, しゅけん
7, 日本国民, にほんこくみん
8, 国事, こくじ
9, 内閣, ないかく
10, 国政, こくせい
11, 法律, ほうりつ
12, 皇室典範, こうしつてんぱん
13, 摂政, せっしょう
14, 内閣総理大臣, ないかくそうりだいじん
15, 最高裁判所, さいこうさいばんしょ
16, 裁判官, さいばんかん

準備

日本語の csv ファイルを使いたいので、fastercsv をインストールする

sudo gem install fastercsv

プログラム

#! ruby -Ku
# -*- coding: utf-8 -*-

require "rubygems"
require "fastercsv"

k = Array.new 
yomi = Array.new

# read keyword data from "keywords.csv" 
FasterCSV.foreach("keywords.csv") do |row|
   id = row[0].strip.to_i
   k[id] = row[1].strip
   yomi[id] = row[2].strip
end

# find keywords using "index()" in all data files 
FasterCSV.foreach("articles.csv") do |row|
  # read a document file into "docmain"  variable
  filename = row[1].strip 
  f = open(filename, "r");
  docmain = f.read
  f.close

  # find keywords using "index()"
  for i in 0..(k.size - 1) do
    if (! k[i].nil?) 
      pos = docmain.index(k[i]) 
      while (pos != nil) do
        line = ""
        line << filename
        line << ", " 
        line << pos.to_s  
        line << ", " 
        line << k[i]
        line << ", " 
        line << yomi[i]
        puts line
        # try to fine next 
        pos = docmain.index(k[i], pos + 1) 
      end
    end
  end
end

# find keywords using "index()" in all data files 
FasterCSV.foreach("articles.csv") do |row|
  # read a document file into "docmain"  variable
  filename = row[1].strip 
  f = open(filename, "r");
  docmain = f.read
  f.close

  # replace keywords using "gsub()"
  a = docmain
  for i in 0..(k.size - 1) do
    if (! k[i].nil?) 
      a.gsub!(k[i], k[i] + "(" + yomi[i] + ")" ) 
    end
  end
  p a
end

◆ 実行結果の例 (execution result example)

[image]