Python Tips: Mac の辞書アプリを Python から利用したい

Mac に備え付けの辞書アプリを Python から利用する方法についてです。

import DictionaryServices

Mac には Python が同梱されており、その Python を使うと辞書アプリにアクセスすることができます。実際には

  • 辞書アプリ API が Objective C 用に用意されており、
  • さらに、その Objective C には PyObjC を使って Python からアクセスできる

ということで、 Python から辞書アプリへのアクセスが可能となっています。 Python → Objective C → 辞書アプリという流れですね。

早速実際のサンプルコードを見てみたいと思います。

mac_dict_app_short.py:

#!/usr/bin/python2.7
# coding: utf-8

# 辞書アプリにアクセスするためのパッケージ
from DictionaryServices import DCSGetTermRangeInString, DCSCopyTextDefinition

# 辞書で検索したい単語
word = u'平成'

# 辞書で単語を検索する
# 最初に DCSGetTermRangeInString で入力された文字列の中から有効な単語の範囲を割り出す
word_range = DCSGetTermRangeInString(None, word, 0)
# 続いて DCSCopyTextDefinition で辞書での検索結果を取得する
word_definition = DCSCopyTextDefinition(None, word, word_range)

print(word_definition)

こちらを mac_dict_app_short.py などのファイル名で保存し、 Mac OS X に同梱されている Python ( El Capitan の場合は /usr/bin/python2.7 )で実行します。無事に処理が成功すれば次のような結果が返ってくるでしょう。

$ /usr/bin/python2.7 mac_dict_app_short.py
へいせい【平成】Heisei.▸ 私は平成元年卒業だI graduated in 1989 [in the first year of Heisei]. (!特に日本の元号を明記する必要がある場合を除いて, 西暦を用いる)

かんたんに解説します。

DictionaryServices は Mac OS X に備え付けの辞書アプリを利用するためのパッケージ(ライブラリ)です。私の環境では実体は以下のディレクトリでした。

/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC/DictionaryServices

公式のドキュメントによると、このパッケージには大きく 2 つの機能があるようです。

  • 辞書アプリを使う機能。結果は辞書アプリを立ち上げて表示する。
  • 辞書アプリを使う機能。結果はプログラム内で返す。

辞書アプリを立ち上げる 1 の使い方でもいいのですが、せっかくターミナルから利用するのであればターミナル内で完結する 2 の形を使いたいものです。実際、今回のコードでは 2 の方を利用しています。

2 を実現するための具体的な関数がコード内で使用している 2 つの関数です。

  • DCSGetTermRangeInString
  • DCSCopyTextDefinition

前者の DCSGetTermRangeInString は渡された文字列の中から単語として有効な範囲(インデックス)を検索する関数です。後者の DCSCopyTextDefinition は実際に辞書を検索する関数です。

いずれも引数は、第 1 引数に None を、第 2 引数に検索したい単語を、第 3 引数にインデックスを渡す形になっています。詳しくは公式のドキュメントに書いてあるので興味のある方はそちらを参照してみてください。

https://developer.apple.com/documentation/coreservices/1446842-dcscopytextdefinition

GitHub Gist に任意の単語を検索できる完全版を置きました。こちらを使うと、標準入力の各行に対して辞書を引いた結果を返してくれます。調べたい単語がたくさんあって、単語をひとつずつ調べるのが面倒なときなんかには重宝するかと思います。

mac_dict_app.py:

使い方のイメージは次のとおりです。

$ cat words.txt
Mac
転勤族
IoT
$ chmod u+x mac_dict_app.py
$ ./mac_dict_app.py < words.txt
Mac
Mac 1 |mak| ▶noun trademark a type of personal computer. ORIGIN 1980s: from Macintosh, the brand name of a range of computers manufactured by Apple Inc.; the range was named after a variety of dessert apple (see McIntosh).
転勤族
てんきん【転勤】名詞a transfer /trǽnsfəːr/ .▸ 転勤希望one's transfer request.転勤する動詞▸ 彼は神戸支店に転勤したHe (was [got]) transferred /trænsfə́ːrd/ to the Kobe branch (office). (!受身では他人の意志で転勤させられた感じを伴う) ▸ 松井一男さんをご紹介いたします. このたび名古屋支社から転勤してこられましたI'd like to introduce Mr. Kazuo Matsui. He's just joined us from the Nagoya office.
IoT
IoT ▶noun short for Internet of things: nearly every industry will be affected by the IoT | [ as modifier ] : IoT devices.

最初のサンプルではコード内で単語を指定していたので特に問題はありませんでしたが、標準入力から日本語を渡したい場合、それをまた標準出力に返したい場合にはデコード/エンコードの処理が必要なので注意が必要です。上の Gist のコードではこのあたりを考慮しています。 まとめて検索できるのはとても便利です。

参考

追記 2018/04/28

この API を使って、 Sublime Text エディタから Mac の辞書を素早く弾ける Sublime Text パッケージを作りました。興味のある方はよろしければご覧ください。