• R/O
  • SSH

Tags
No Tags

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

File Info

Rev. f636e4c6930f06d2eeedeb04b032eb13260ce488
Tamaño 5,316 octetos
Tiempo 2021-09-23 01:16:28
Autor Haruka Masaki
Log Message

Update to 20210922

Content

#! /usr/bin/env ruby
# coding: utf-8

require 'nkf'


# ==============================================================================
# remove_unnecessary_entries
# ==============================================================================

def remove_unnecessary_entries
	file = File.new($filename, "r")
		lines = file.read.split("\n")
	file.close

	# 重複行を削除
	lines = lines.uniq

	l2 = []
	p = 0

	lines.length.times do |i|
		s = lines[i].split("	")
		yomi = s[0]
		hyouki = s[4]

		# 表記の全角英数を半角に変換
		hyouki = NKF.nkf("-m0Z1 -W -w", hyouki)

		# 表記の「~」を「〜」に置き換える
		# jawiki-latest-all-titles の表記に合わせる。
		hyouki = hyouki.gsub("~", "〜")

		# 表記の最初が空白の場合は取る
		if hyouki[0] == " "
			hyouki = hyouki[1..-1]
		end

		# 表記の全角カンマを半角に変換
		hyouki = hyouki.gsub(",", ", ")

		# 表記の最後が空白の場合は取る(「, 」もここで処理)
		if hyouki[-1] == " "
			hyouki = hyouki[0..-2]
		end

		# 読みにならない文字を削除したhyouki2を作る
		hyouki2 = hyouki.tr(' !?=:・。★☆', '')

		# hyouki2がひらがなとカタカナだけの場合は、読みをhyouki2から作る
		# さいたまスーパーアリーナ
		if hyouki2 == hyouki2.scan(/[ぁ-ゔァ-ヴー]/).join
			yomi = NKF.nkf("--hiragana -w -W", hyouki2)
			yomi = yomi.tr("ゐゑ", "いえ")
		end

		# 読みが2文字以下の場合はスキップ
		if yomi[2] == nil ||
		# hyouki2が1文字の場合はスキップ
		hyouki2[1] == nil ||
		# hyoukiが26文字以上の場合はスキップ
		hyouki[25] != nil ||
		# 読みの文字数がhyouki2の4倍を超える場合はスキップ
		# けやきざかふぉーてぃーしっくす(15文字) 欅坂46(4文字)
		yomi.length > hyouki2.length * 4 ||
		# hyouki2の文字数が読みの文字数より多い場合はスキップ
		# 英数字表記が削除されるのを防ぐため、hyouki2の文字数は (bytesize / 3) とする。
		# みすたーちるどれんりふれくしょん(16文字) Mr.Children REFLECTION(22bytes / 3)
		# あいしす(16文字) アイシス(48bytes / 3)
		yomi.length < hyouki2.bytesize / 3 ||
		# 読みがひらがな以外を含む場合はスキップ
		yomi != yomi.scan(/[ぁ-ゔー]/).join ||
		# hyoukiがコードポイントを含む場合はスキップ
		# デコードする場合
		# hyouki = hyouki.gsub(/\\u([\da-fA-F]{4})/){[$1.hex].pack("U")}
		hyouki.index("\\u") != nil ||
		# hyouki2が数字を3個以上含む場合はスキップ
		# 国道120号, 3月26日
		hyouki2.scan(/\d/)[2] != nil
			next
		end

		l2[p] = yomi + "	" + s[1..3].join("	") + "	" + hyouki
		p = p + 1

		# 読みが「ゔ」を含む場合に「ぶ」の読みを作るか(デフォルトでは作らない)
		# すてぃーゔんすぴるばーぐ	0	0	6000	スティーヴン・スピルバーグ
		# すてぃーぶんすぴるばーぐ	0	0	6000	スティーヴン・スピルバーグ
		vu2bu = 0

		if vu2bu == 0
			next
		else
			yomi2 = yomi.gsub("ゔぁ", "ば")
			yomi2 = yomi2.gsub("ゔぃ", "び")
			yomi2 = yomi2.gsub("ゔぇ", "べ")
			yomi2 = yomi2.gsub("ゔぉ", "ぼ")
			# 「ゔ」を最後にしないと「ゔぁ」が「ぶぁ」になる
			yomi2 = yomi2.gsub("ゔ", "ぶ")

			# yomi2が4文字以上の場合はyomi2を追加
			if yomi2 != yomi && yomi2[3] != nil
				l2[p] = yomi2 + "	" + s[1..3].join("	") + "	" + hyouki
				p = p + 1
			end
		end
	end

	lines = l2
	l2 = []

	# UT辞書の並びを変える
	# (変更前) げんかん	1823	1823	5278	玄関
	# (変更後) げんかん	玄関	5278	1823	1823
	lines.length.times do |i|
		s = lines[i].split("	")
		s = [s[0], s[4], s[3], s[1], s[2]]
		lines[i] = s.join("	")
	end

	file = File.new("../mozc/mozcdic.txt", "r")
		mozcdic = file.read.split("\n")
	file.close

	# Mozc辞書の並びを変えてマークをつける
	# (変更前) げんかん	1823	1823	6278	玄関
	# (変更後) げんかん	玄関	*6278	1823	1823
	mozcdic.length.times do |i|
		s = mozcdic[i].split("	")
		s = [s[0], s[4], "*" + s[3], s[1], s[2]]
		mozcdic[i] = s.join("	")
	end

	lines = lines + mozcdic
	mozcdic = []
	lines = lines.sort

	# この時点での並び。Mozc辞書が先になる
	# げんかん	玄関	*6278	1823	1823
	# げんかん	玄関	5278	1823	1823

	dicfile = File.new($dicname, "w")

	lines.length.times do |i|
		s1 = lines[i].split("	")
		s2 = lines[i - 1].split("	")

		# Mozc辞書はスキップ
		if s1[2][0] == "*"
			next
		# Mozc辞書と「読み+表記」が重複するUT辞書はスキップ
		elsif s2[2][0] == "*" && s1[0..1] == s2[0..1]
			next
		# UT辞書内で重複するエントリをコスト順にスキップ
		elsif s2[2][0] != "*" && s1[0..1] == s2[0..1]
			next
		end

		s1 = [s1[0], s1[3], s1[4], s1[2], s1[1]]
		dicfile.puts s1.join("	")
	end

	dicfile.close
end


# ==============================================================================
# main
# ==============================================================================

targetfiles = ARGV

if ARGV == []
	puts "Usage: ruby script.rb [FILE]"
	exit
end

targetfiles.length.times do |i|
	$filename = targetfiles[i]
	$dicname = $filename + ".need"

	remove_unnecessary_entries
end