[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-users:03833] Re: Generate JE dictionary from gene.txt



From: Satoru Takabayashi <ccsatoru@xxxxxxxxxxxxxxxxxx>
Subject: [debian-users:03765] Generate JE dictionary from gene.txt
Date: Tue, 13 Jan 1998 21:27:05 +0900
Message-ID: <199801131233.VAA11423@xxxxxxxxxxxxxxxxxx>

> 高林@愛知大学と申します
> 
> # 先ほど linux-users に流した内容に少し補足が付け加えられています。
> 
> 少し前に gene というフリーの英和辞書が Mule で使えるということが少
> し話題になりましたが、この英和辞書を無理やり和英辞書に変換するため
> のいいかげんなスクリプトを作ってみました。これ以上ないというくらい
> アドホックな作りなので、あまり役に立たないかもしれませんが、まった
> く使えないわけでもないので紹介してみます。興味のある方はお試し下さ
> い。

使わせて頂きました。動作は良好でした。

> このスクリプトの実行には nkf v1.62, KAKASI, Perl5 が必要です。
> "geneJE.pl" という名前で保存して gene.txt (オリジナル) のあるディ
> レクトリで実行してください。
> 
> …と、和英辞書をでっちあげてみたものの、これを Mule で使おうとして
> うまくいかなくて困っています。 Tagami-K さんの作成された gene.el 
> を少しいじればなんとかなりそうなのですが、 Emacs Lisp はさっぱり分
> からないのでお手上げの状態です。
> 
> 他力本願で申し訳ございませんが、上記の和英辞書を Mule で使えるよう
> にしてくださる方はいませんでしょうか:)。 gene.el を拡張して和英辞
> 書もひけるようになったら便利だと思います。

ちょっと作ってみましたので、このメールに添付しておきます。
#ほとんど gene.el と edict.el からのパクリです。(^^;

look に漢字の引数を渡すのは、かなり困難と思われたため、辞書をバッファに読み込
んで、そのバッファを検索するようにしてあります。
そのため最初の起動では辞書を読み込む動作があるので少し遅いですが、二回目から
は look を使用したのと同じくらい速く検索できます。

gene.elをもじった方法でうまく行かない理由は、漢字コードの相違にあるようです。
Mule 内部では internal code という Mule 独自の文字コードを使用していますが、
これがわざわい(?)して、look の引数に渡した文字列も internal code になって
しまうので、漢字を look に渡すとうまく検索できません。

辞書そのものを Mule の internal code に変換してしまう方法も試してみたのです
が、辞書にあるのに検索できなかったり、検索できても文字化けしてしまったりと、
あまり思わしくないので、辞書をバッファに読み込む方法を取りました。

欠点としては、大きな辞書になるほど初回の読み込みに時間がかかり、メモリーを食
うということでしょうか。3MB の辞書を読み込むと top 等で見た Mule の大きさが
3MB 増加します。

また前方一致検索ではないため、たとえば「辞典」と言うキーワードに対して、以下
のような項目にヒットします。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ウェブスター=ニューワールド米語辞典 Webster's New World Dictionary	WNWD, 
ウェブスター=ニューワールド米語辞典;略:WNWD	Webster's New World Dictionary, 
オックスフォード英語大辞典 Oxford English Dictionary	OED, 
オックスフォード英語大辞典;略:OED	Oxford English Dictionary, 
ロングマン現代英英辞典	Longman Dictionary of Contemporary English, 
ロングマン現代英英辞典 Longman Dictionary of Contemporary English	LDOCE, 
一般的な意見 / 英々辞典を見るかぎり,consensusには全員一致(unanimity)の意味はない	consensus, 
英語を外国語として学ぶ人には必携の英英辞典	Longman Dictionary of Contemporary English, 
英国人名辞典 Dictionary of National Biography	D.N.B., 
英国人名辞典;略:D.N.B.	Dictionary of National Biography, 
辞典	dictionary, 
小辞典	glossary, 
人名辞典	biographical dictionary, 
百科辞典	encyclopedia, 
分類語彙辞典	thesaurus, 
和英辞典	Japanese-English dictionary, 
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

これはこれで便利かも知れないのでそのままにしています。(^^;

> この和英辞書作成スクリプトは需要があるようでしたら、もう少し真面目
> に作りたいと思います。ご意見をお待ちしております。

Nifty の FENG で配布されている「英辞郎」という 14MB 近くある辞書ファイルを変
換に掛けたところ、私の非力なマシン(P-5 100MHz Mem 40MB)で 6時間以上かかっ
てしまいました。(^^;
#perl なので仕方ないですが…

御役に立つかどうか分かりませんが、以下に Emacs Lisp を添付します。

(defvar *jgene-files* '("/usr/local/dic/jgene.dic")
  "和英辞典ファイルの指定")

というところを修正して、elisp のあるディレクトリに保存して .emacs に

;; JGENE M-; で検索
(autoload 'jgene-search-kanji "jgene" "和英辞典" t nil)
(global-set-key "\e;" 'jgene-search-kanji)

としておくと M-; で検索できるようになります。
よろしくお願いします。

-------
Soichiro Ohta
	E-Mail: s-oota@xxxxxxxxxxxxxxx

IN A WORLD WITHOUT FENCES...
WHO NEEDS GATES?
;; gene.dic を変換した和英辞典をmuleで利用できる
;; ようにするemacs lispです。
;; 1998 Jan 18 (Sun)

(defvar *jgene-files* '("/usr/local/dic/jgene.dic")
  "和英辞典ファイルの指定")

;; jgene.dic を読み込むバッファの設定
(defvar *jgene-buffer-name* "*jgene*")
(defvar *jgene-buffer* nil)

;; マッチした単語のバッファ
(defvar *jgene-match-buffer-name* "*jgene matches*")
(defvar *jgene-match-buffer* nil)

;; 和英辞書の初期読み込み
(defun jgene-init ()
  ;; マッチバッファ作成
  (if (not (get-buffer *jgene-match-buffer-name*))
    (setq *jgene-match-buffer* (get-buffer-create
				*jgene-match-buffer-name*)))
  ;; 和英辞書の読み込み
  (if (not (get-buffer *jgene-buffer-name*))
    (progn
      (save-window-excursion
	(setq *jgene-buffer* (get-buffer-create *jgene-buffer-name*))
	(set-buffer *jgene-buffer*)
	(mapcar '(lambda (filename)
		   (if (file-readable-p filename)
		     (insert-file-contents filename)
		     (message (format "While loading jgene files: \"%s\" isn't readable!" filename))))
		*jgene-files*)
	;; 辞書ファイル読み込み失敗
	(if (= 0 (buffer-size))
	  (progn
	    (kill-buffer *jgene-buffer*)
	    (error "No jgene files found! Check value of *jgene-files*.")))
	)))
  t)

;; 辞書の強制読み込み
(defun jgene-force-init ()
  (interactive)
  (kill-buffer *jgene-buffer*)
  (jgene-init))

;; 辞書のサーチ
(defun jgene-search-kanji (word)
  ;; 辞書初期設定
  (jgene-init)
  ;; pointの周りの単語を初期単語として得る
  (interactive (list (read-japanese-word "Japanese word: "
				  (get-init-japanese-word))))
    (if (equal word "")
      (error "No word to search for!")
      (jgene-search-and-display word))
  t)

;; 単語にマッチした行を返す
(defun copy-of-current-line ()
  (let ((line-start (progn (beginning-of-line) (point)))
	(line-end   (progn (end-of-line) (point))))
    (buffer-substring line-start line-end)))

;; *jgene-buffer* をサーチし、マッチした行を *jgene-match-buffer* に
;; 表示する
(defun jgene-search-and-display (key)
  (jgene-init)
  (save-excursion
    (let (match-list)
      (setq match-list (jgene-search key))
      (if (not match-list)
	(error "No matches for key \"%s\"." key))
      (jgene-display match-list))
    (message "Found it!")))

;; マッチした内容を *jgene-match-buffer* に表示する
(defun jgene-display (match-list)
  (set-buffer *jgene-match-buffer*)
  (erase-buffer)
  (mapcar '(lambda (string-item)
	     (insert string-item)
	     (newline))
	  match-list)
  (display-buffer *jgene-match-buffer*))

;; *jgene-buffer* をサーチし、マッチした行を返す
(defun jgene-search (key)
  (save-window-excursion
    (message (format "Searching for word \"%s\"..." key))
    (let ((match-list nil))
      (set-buffer *jgene-buffer*)
      (goto-char (point-min))
      ;; マッチした行を *jgene-match-buffer* にコピー
      (while (search-forward key nil t)
	(setq match-list (append match-list (list
					     (copy-of-current-line)))))
      match-list)))

(defvar japanese-word-history '()
  "jgene-word用のminibufferのhistory")

;; minibufferから単語を読み取る
(defun read-japanese-word (prompt init)
  (read-from-minibuffer prompt init nil nil 'japanese-word-history))

;; pointの周りの単語を初期単語として得る
(defun get-init-japanese-word ()
  (save-excursion
    (if (not (looking-at "\\<"))
	(forward-word -1))
    (downcase (buffer-substring
	       (point) (progn
			 (forward-word 1)
			 (point))))))