やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

Raspbianで使えるローカル辞書が欲しい(GENE95)

 ネット検索は面倒&遅い。

これまで

  • Googleで検索
    • キーワード 意味
    • キーワード 類語
    • キーワード 対義語
    • キーワード 英語
    • キーワード キーワード 違い
    • 翻訳
      • キーワード
      • 文章
      • URL

 毎回Google検索すると以下のような不都合が生じる。

  • ネット接続必須
  • メモリ圧迫
    • フリーズ、ひいてはクラッシュのリスク増加
    • スワップ酷使によるHDD寿命短縮
  • 手間&遅い
    • キーワード入力し、表示待機し、リンクをクリックし、本文を見る

辞書を使う場面

英和・和英

  • 名付け
    • プログラミング
      • 変数
      • メソッド
    • ファイル・ディレクトリ名
  • リビジョン管理
    • コミットメッセージ

 名付けは非常に重要であり多用するので是非ともローカル辞書が欲しい。

ローカル辞書が欲しい

  1. 辞書を選別する
  2. 辞書をダウンロード&展開する
  3. 辞書の文字コードを調べる
  4. 辞書の文字コードを変換する
  5. スクリプトを作る

1. 辞書を選別する

1-1. ファイル形式

 辞書データのファイル形式はPDICである。PDIC形式はプレーンテキストで見出語, 訳語の行が交互に現れる形式である。

見出語1
訳語1
見出語2
訳語2

 たとえば国語辞典なら以下。

愛
幻想である。
夢
空想である。

 英和(英単語)辞典なら以下。

love
愛
dream
夢

 この形式を保つことでgrepコマンドにより語と訳を表示できる。

引数 説明
grep -A 一致した後の NUM 行を表示する
grep -B 一致した前の NUM 行を表示する

1-1-1. 未来は暗い?

 おそらく、テキスト形式の辞書データは営利目的にそぐわない。よって販売終了とする。これからはスマホアプリという形で販売する狙いか。

 辞書は自分で作るしかない。

2. 辞書をダウンロード&展開する

cd /tmp/work
wget http://www.namazu.org/~tsuchiya/sdic/data/gene95.tar.gz
tar zxvf gene95.tar.gz
wget http://www.namazu.org/~tsuchiya/sdic/data/gene95.tar.gzhttp://www.namazu.org/~tsuchiya/sdic/data/edict.gz
tar zxvf edict.gz

3. 辞書の文字コードを調べる

GENE95

$ file -i /tmp/work/gene.txt
/tmp/work/gene.txt: text/plain; charset=unknown-8bit

 unknownになったがShift-JISである。

 Windowsで作成されたので改行コードがCR+LFになっているはず。Linux用にLFのみにすべく以下コマンドを実行する。

$ cat ./src.txt | tr '>' '\n' > ./dst.txt
$ cat /tmp/work/gene.txt | tr -d '\r' > /tmp/work/gene.LF.txt

EDICT

$ file -i /tmp/work/edict
/tmp/work/edict: text/plain; charset=iso-8859-1

4. 辞書の文字コードを変換する

$ iconv -c -f sjis -t utf8 /tmp/work/gene.LF.txt > /tmp/work/gene.LF.utf8.txt
$ iconv -c -f ISO-8859-1 -t utf8 /tmp/work/edict > /tmp/work/edict.utf8

 EDICTはうまく変換できなかったので以下からダウンロードした。

5. スクリプトを作る

  1. 辞書を引くスクリプトをつくる
  2. コマンド名をdictで統一する
  3. 辞書を自動で指定する

5-1. 辞書を引くスクリプトをつくる

~/.bashrc

# 辞書を引く(英和)
function ejdict() {
  grep "$1" /tmp/work/gene.LF.utf8.txt -E -A 1 -wi --color=always | less -R -FX
}
# 辞書を引く(和英)
function jedict() {
  grep "$1" /tmp/work/gene.LF.utf8.txt -E -B 1 -wi --color=always | less -R -FX
}

 使ってみる。

$ ejdict glasses
$ jedict 眼鏡

 接頭辞ej, jeがわかりにくい。コマンド名dictで統一したい。

5-2. コマンド名をdictで統一する

#!/bin/bash
# ----------------------------------------------------------------------------
# 辞書検索
#   $1: 辞書(ej: 英和, je:和英, 他:エラー)
#   $2: 検索キーワード
# 更新日:
#   2019-02-17 新規作成
# ----------------------------------------------------------------------------
DictFile() { echo "${HOME}/root/db/dictionary/GENE95/gene.LF.utf8.txt"; }
EnJa() { grep "${1}" "`DictFile`" -E -A 1 -wi --color=always | less -R -FX; }
JaEn() { grep "${1}" "`DictFile`" -E -B 1 -wi --color=always | less -R -FX; }
Run() {
    case "${1}" in
        "ej" ) EnJa "${2}" ;;
        "je" ) JaEn "${2}" ;;
        * ) echo "第一引数は 'ej' 'je' のいずれかにしてください。それぞれ英和、和英です。" ;;
    esac
}
Run "${1}" "${2}"

 第一引数ej, jeがいちいち面倒。

5-3. 辞書を自動で指定する

#!/bin/bash
# ----------------------------------------------------------------------------
# 辞書検索
#   $1: 検索キーワード(キーワードが英字なら英和、それ以外なら和英)
# 使用例:
#   dict 終わり    和英
#   dict end       英和
#   dict ^end$     完全一致(^検索キーワード$)
#   dict ^end      前方一致(^検索キーワード)
#   dict end$      後方一致(検索キーワード$)
# 更新日:
#   2019-02-18 引数最小化
#   2019-02-17 新規作成
# ----------------------------------------------------------------------------
DictFile() { echo "${HOME}/root/db/dictionary/GENE95/gene.LF.utf8.txt"; }
EnJa() { grep "${1}" "`DictFile`" -E -A 1 -wi --color=always | less -R -FX; }
JaEn() { grep "${1}" "`DictFile`" -E -B 1 -wi --color=always | less -R -FX; }
Run() { [[ "${1}" =~ ^[a-zA-Z_0-9]+$ ]] && EnJa "${1}" || JaEn "${1}"; }
#Run() { [[ "${1}" =~ ^[\u3041-\u3096\u30A1-\u30FA々〇〻\u3400-\u9FFF\uF900-\uFAFF\uD840-\uD87F\uDC00-\uDFFF]+$ ]] && EnJa "${1}" || JaEn "${1}"; }
#Run() {
# https://so-zou.jp/software/tech/programming/tech/regular-expression/meta-character/variable-width-encoding.htm
#    HIRAGANA=\u3041-\u3096\
#    KATAKANA=u30A1-\u30FA
#    KANJI=々〇〻\u3400-\u9FFF\uF900-\uFAFF\uD840-\uD87F\uDC00-\uDFFF
#    [[ "${1}" =~ ^[${HIRAGANA}${KATAKANA}${KANJI}]+$ ]] && JaEn "${1}" || EnJa "${1}"
#}
Run "${1}"

 dict endなど一般的な語を調べると膨大な量が出る。endに完全一致するものを最上位に表示したい。

参考

 質問サイト。

 EPWING形式。

 辞書ファイルまとめ。

 著作権切れ辞書の画像データ。

 Wikipediaのローカル化は比較的かんたんかも。画像ファイルからテキスト化はOCR技術が必要なので難易度が高そう。

所感

 いい感じ。あとは日本語で文章を書くとき用として以下の辞書も欲しい