###前提・実現したいこと
単語を入力すると、その単語の意味を表示するようなプログラムをC#やJAVAで構築したいと思い、それを実現させるために、Web上に存在する辞書データを利用して、そのデータを参考にして意味を表示させたいと考えております。Webで探してみたら、百科辞書というものが見つかりました。これは、LZHファイルというもので用意されているようなのですが、これを辞書データとして利用できるのではと思いました。
そこで尋ねたいことがあるのですが、C#かJAVAのどちらでもよいので、これらのデータの取り扱い方を教えていただけないでしょうか。もしこれらのデータがC#やJAVAでのプログラミングにおいて利用できないデータであるならば、この他に辞書データとして利用できそうなデータを知っておりましたら、教えていただけないでしょうか。
また、もしよろしければ、簡単なプログラムでいいので、こういうコードの書き方をすればこのデータのこの部分を参考にして表示できる、といったプログラムの書き方も教えてもらえないでしょうか。よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/03/12 04:44
回答3件
0
ベストアンサー
Mac 上の ruby で作ってみました。
3 つのプログラムで構成しています。
- lzh ファイルを download して、text ファイルをつくる。
- text ファイルからインデックスをつくる。
- 指定した単語の説明を表示する。
ruby
1# brew install lha 2# brew install nkf 3 4# lzh ファイルをダウンロードする 5system 'rm -fr lzh' 6system 'mkdir lzh' 7%w[a ka sa ta na ha ma ya ra wa].each do |name| 8 system "curl http://pddlib.v.wol.ne.jp/japanese/#{name}.lzh -o lzh/#{name}.lzh" 9end 10 11# lzh を解凍する 12system 'rm -fr txt' 13system 'mkdir txt' 14Dir.chdir 'txt' 15Dir.glob('../lzh/*.lzh').each do |lzh| 16 system "lha x --archive-kanji-code=sjis --system-kanji-code=utf8 #{lzh}" 17end 18Dir.chdir '..' 19 20# 文字コードを utf8, 改行コードを LF, ファイル名の拡張子を .txt に変更する 21Dir.glob('txt/*').each do |file| 22 system "nkf -wLu #{file} >> 1.txt" 23 system "mv 1.txt #{file}.txt" 24 system "rm -f #{file}" 25end
make_index.rb
ruby
1# require 'json' 2 3index = {} 4prev_key = nil 5Dir.glob('txt/*.txt') do |file| 6 text = IO.readlines(file).map { |line| line.chop } 7 8 text.each_with_index do |line, idx| 9 next if line.length.zero? || "\t- ".index(line[0]) 10 11 key = line.sub(/\A★/, '').sub(/\A\[\d\]/, '') 12 index[prev_key][-1] = "#{index[prev_key][-1]}:#{idx - 1}" unless prev_key.nil? 13 prev_key = key 14 15 index[key] ||= [] 16 index[key] << "#{file}:#{idx}" 17 end 18end 19 # puts JSON.pretty_generate(index) 20 # File.open('index.json', 'w') { |file| JSON.dump(index, file) } 21 File.open('index.txt', 'w') do |file| 22 index.each do |key, val| 23 file.write("#{key}\t#{val.join(' ')}\n") 24 end 25 end
dic.rb
ruby
1INDEX_FILE = 'index.txt'.freeze 2 3def show_pos(item) 4 pos = item.split(':') 5 lines = IO.readlines(pos[0]) 6 s = pos[1].to_i 7 e = pos.size == 3 ? pos[2].to_i : lines.size - 1 8 puts '------------------' 9 puts lines[s..e] 10end 11 12return if ARGV.size == 0 13 14key = ARGV[0] + "\t" 15results = File.readlines(INDEX_FILE).select { |line| line.start_with?(key) } 16results.each do |line| 17 line.split(/\t| /)[1..-1].each do |items| 18 items.split(' ').each do |pos| 19 show_pos(pos) 20 end 21 end 22end
実行例
$ ruby dic.rb "あいあい" ------------------ ★あいあい 【アイアイ】 ◇[英]aye-aye、[学]Daubentonia madagascariensis ○(1)[哺]霊長目(Primates)アイアイ科(Daubentoniidae)のサ ル。 マダガスカル島にのみ生息。 「指猿(ユビザル)」とも呼ぶ。 ◎メガネザル(眼鏡猿)・キツネザル(狐猿)・ロリス(loris)な どの近縁種。 ○(2)[楽]相田裕美作詞、宇野誠一郎作曲の童謡。 ------------------ あいあい 【娃娃】 ◇[中]wawa(ワーワ) ○(1)(中国語で)赤ん坊。 ○(2)(中国語で)人形。 ◎洋娃娃(yangwawa):バービー人形。
投稿2017/03/12 02:10
総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/03/12 04:41
2017/03/12 06:38
2017/03/13 18:43
0
百科辞書、なかなか面白いサイトですね。
さて、このサイトで配布しているファイルを利用してということでいいでしょうか。まず、配布されているLZH形式のファイルですが、サイトの説明にもある通り圧縮ファイルです(今時LZH形式を使うのも珍しいですが)。なので、まずはこのファイルを解凍しなければなりません。各種圧縮形式に対応したDLLが用意されているので、それらを利用して解凍すればよろしいでしょう。
続いて解凍して展開されたファイルを解析して辞書データにするという処理になると思います。中を見たところ、独特の形式(と言うか、本当に見た目重視に編集されている)なので、どういう風にしてデータに起こすかというのは考える必要があります。
後は、このデータをどう持つかを考える必要がありますかね(データベース化するかとか、独自の形式のファイルにするかとか)。
基本的には「テキストファイルを読み込んで、そのデータを加工する」になると思いますので、いかなる言語でもプログラムは組めると思います。
投稿2017/03/11 18:24
総合スコア1557
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/03/12 04:35
2017/03/12 14:27
2017/03/13 18:44
0
Ruby
1#encoding : utf-8 2 3def index(path) 4 Dir.glob("#{path}/*").each do |folder| 5 Dir.glob("#{folder}/*.txt").each do |file| 6 array = [] 7 File.open(file) do |f| 8 f.each_line do |line| 9 array << line 10 end 11 end 12 array.shift(5) 13 array.pop 14 str = "" 15 array.each do |element| 16 element = element.gsub("\n", "<-|->") 17 unless element.include?("\t") 18 element = "\n" + element 19 end 20 str += element 21 end 22 str.slice!(0) 23 File.open("index.txt", "a") do |output| 24 output.puts(str) 25 end 26 end 27 end 28end 29 30def search(path, word) 31 File.open(path) do |f| 32 f.each_line do |line| 33 comp = 0 34 line.gsub!("<-|->", "\n").each_line.with_index do |l, i| 35 if i == 0 && l.include?(word.encode("windows-31J")) 36 comp = 1 37 puts "-----------------------------" 38 end 39 if comp == 1 40 puts l 41 end 42 end 43 end 44 end 45end 46 47print "検索する文字列を入力してください:" 48input = gets.chomp 49search("index.txt", input)
検索する文字列を入力してください:なぽりたん ----------------------------- [1]なぽりたん 【ナポリタン】 ◇[フ]napolitain ○(1)[料]トマトを使ってイタリアの都市ナポリ風に味付けを した料理。 ○(2)[料](特に)スパゲティ(spaghetti)をベーコン・マッシュ ルームなどと炒(イタ)めて、トマトピューレをからめた料理。 参照⇒なぽれたーに(ナポレターニ)(2) ----------------------------- [2]なぽりたん 【ナポリタン】 ◇[英]Neapolitan(ニーポリタン) ○(1)[形]ナポリの。 ○(2)[名]ナポリの人。ナポリ出身の人・ナポリ在住の人。 イタリア語では男性を「ナポレターノ(napoletano)」、女性を 「ナポレターナ(napoletana)」と呼ぶ。 ○(3)[食](neapolitan)⇒なぽりたんあいすくりーむ(ナポリタ ンアイスクリーム,ナポリタン・アイスクリーム) ----------------------------- なぽりたんあいすくりーむ 【ナポリタンアイスクリーム】 【ナポリタン・アイスクリーム】 ◇[英]neapolitan ice cream ○[食]いろいろな味と色をつけて層状にしたアイスクリーム。 参照⇒りっぷる(リップル)(4)
C#
1using System; 2 3namespace index1 4{ 5 class Program 6 { 7 static void Main(string[] args) 8 { 9 Console.Write("検索する文字列を入力してください:"); 10 string word = Console.ReadLine(); 11 12 System.IO.StreamReader sr = new System.IO.StreamReader("index.txt", System.Text.Encoding.Default); 13 14 15 while(sr.Peek() >= 0) 16 { 17 18 string line = sr.ReadLine().Replace("<-|->", "\n").ToString(); 19 if (line.Contains(word)) 20 { 21 Console.WriteLine("-----------------------------"); 22 Console.WriteLine(line); 23 } 24 } 25 sr.Close(); 26 Console.ReadKey(); 27 28 } 29 } 30} 31
改良版
Ruby
1def search(word) 2 word = word.chomp.encode("windows-31J") 3 array = [] 4 File.open("index.txt", "r") do |f| 5 f.each_line do |line| 6 flag = 0 7 line.gsub("<-|->", "\n").each_line.with_index do |element, i| 8 if i == 0 && element =~ /\A(#{"★".encode("windows-31J")}|\[\d{1}\])#{word}\Z/ 9 flag = 1 10 end 11 end 12 if flag == 1 13 array << line.gsub("<-|->", "\n") 14 end 15 end 16 end 17 return array 18end 19 20search(ARGV[0]).each do |s| 21 puts "-----------------------------" 22 puts s 23end
実行結果例
----------------------------- [1]なぽりたん 【ナポリタン】 ◇[フ]napolitain ○(1)[料]トマトを使ってイタリアの都市ナポリ風に味付けを した料理。 ○(2)[料](特に)スパゲティ(spaghetti)をベーコン・マッシュ ルームなどと炒(イタ)めて、トマトピューレをからめた料理。 参照⇒なぽれたーに(ナポレターニ)(2) ----------------------------- [2]なぽりたん 【ナポリタン】 ◇[英]Neapolitan(ニーポリタン) ○(1)[形]ナポリの。 ○(2)[名]ナポリの人。ナポリ出身の人・ナポリ在住の人。 イタリア語では男性を「ナポレターノ(napoletano)」、女性を 「ナポレターナ(napoletana)」と呼ぶ。 ○(3)[食](neapolitan)⇒なぽりたんあいすくりーむ(ナポリタ ンアイスクリーム,ナポリタン・アイスクリーム)
素人ながら考えてみました。
文字列に特定の語が含まれるかだけで表示しているので微妙です。
Lhaplusで解凍してRubyで加工しました。
加工の内容
1.「index」というフォルダを1つ作ってその中に解凍してできたフォルダをいれる。
2.「index」の中にあるファイルの拡張子を全て「.txt」にする。
C#はこちらのサイトを参考にしました。
StreamReader でファイルを 1 行ずつ読み込む
文字列に特定の文字列が含まれているかを調べるには?(Contains編)[2.0のみ、C#、VB]
##補足
Ruby
1def index(path) #この処理の名前。何でもよい。 2 Dir.glob("#{path}/*").each do |folder| #indexフォルダの中にあるフォルダを全て取得して配列にする。できた配列から1つずつ要素を取り出してfolderに入れる。 3 Dir.glob("#{folder}/*.txt").each do |file| #folderの中にあるテキストファイルを全て取得して配列にする。できた配列から1つずつ要素を取り出してfileに入れる。 4 array = [] #配列を用意。 5 File.open(file) do |f| #fileを開きます。 6 f.each_line do |line| #fileを一行ずつ読み込んでlineに入れる。 7 array << line #lineをarrayに入れる。(文字コードのエラーでsplitが使えなかったのでこんなことをしています。) 8 end 9 end 10 array.shift(5) #配列の前から5つまでの要素を削除(いらないので) 11 array.pop #配列の最後の要素を削除(いらないので) 12 str = "" #文字列を入れるのに使う。 13 array.each do |element| #arrayの中身を一つずつ取り出してelementに入れる。 14 element = element.gsub("\n", "<-|->") #elementの文字をgsubで置き換える。(改行文字を"<-|->"に置き換えている。この文字列に特に意味はない。) 15 unless element.include?("\t") #elementが改行文字を含まない場合は(unlessはifの逆の意味 「if a != 1」は「unless a == 1」と同じ意味) 16 element = "\n" + element #elementの先頭に改行文字を足す。(こうなる場合は項目の最初だけ) 17 end 18 str += element #strにelementを足す。 19 end 20 str.slice!(0) #strの先頭の改行文字を取り除く。 21 File.open("index.txt", "a") do |output| #index.txtを開く/作る 22 output.puts(str) #index.txtにstrの内容を書き込む。 23 end 24 end 25 end 26end 27 28=begin 29簡単に言うとindexフォルダの中にあるテキストファイルをすべて連結した 301つのテキストファイルを作るということをしている。 31=end
忘れていましたが、「def index」を使う前に
Ruby
1Dir.glob("index/*").each do |folder| 2 Dir.glob("#{folder}/*").each do |file| 3 File.rename(file, "#{file}.txt") 4 end 5end
みたいな感じで「index」フォルダの中にある拡張子のない
テキストファイルに拡張子をつけるということをしていました。
投稿2017/03/14 17:35
編集2017/03/20 18:26退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/03/16 18:38
退会済みユーザー
2017/03/18 07:29 編集
2017/03/19 20:16
退会済みユーザー
2017/03/20 15:40 編集
2017/03/24 15:50
退会済みユーザー
2017/03/24 19:35 編集
2017/03/26 16:44
退会済みユーザー
2017/03/27 08:06 編集
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。