Mavericksのことえりの仕組みを探ってみる

今さらだけど、OSX 10.9 Marvericksになってから、ことえりの仕組みが変わった。ことえりの環境設定や単語登録は、システム環境設定に統合された。特に単語登録の手順は大幅に変更された。登録済みの単語はリスト表示され見やすくなったが、品詞の種類は指定できなくなり、単語とその読みだけを登録するようになった。

OSXになってから最大の変化を経験しているはずなのだけど、この数ヶ月間、適当に使ってきた。それなりに使えるのだけど、やはり時間の経過とともに不満も募ってくる...。

  • 単語登録でショートカットが使えないのは不便とか、
  • 独自の辞書を作りたいのに、ことえり単語登録.appが見当たらないとか、
  • MacBookiPhoneのユーザ辞書が同期してないぞ!とか、

入力とはパソコンを使う上で最も重要な操作である。特に日本語環境で使う場合は、数万文字に及ぶ英数漢字かな混じり文字を、ことえりなどのIMEを駆使して、素早く正確に入力することが求められる。ストレスのない入力環境を目指すために、Mavericksことえり仕組みを徹底的に調べてみた。

変換辞書(~/Library/Dictionaries/)

ユーザ辞書
  • ~/Library/Dictionaries/CoreDataUbiquitySupport
  • ~/Library/Dictionaries/ユーザ辞書


単語登録すると、ここにあるユーザ辞書に保存される。

  • そのまんまの名前の「ユーザ辞書」と「CoreDataUbiquitySupport」の二つが存在するが、どちらも同じ内容である。
    • ユーザ辞書は、ことえり単語登録.appが利用する旧来の辞書。
      • ことえり単語登録.appで開いて、テキストに書き出す...ことでその内容を確認できる。
    • CoreDataUbiquitySupportは、ユーザ辞書をCoreData形式に変換した辞書。
      • CoreData形式とは、つまりsqliteのデータベースなので、sqlite3コマンドで除き見ることもできる。
各種辞書


各種の追加辞書も、ユーザ辞書と同じ階層にインストールしておく。

  • 自分の場合は、かなり以前からお世話になっている上記二つの辞書をインストールしている。
  • システム環境設定 >> キーボード >> 入力ソース の下までスクロールすると、辞書の優先順位とオン・オフの設定もできる。


ユーザ辞書の中身を覗いてみる

ユーザ辞書
  • OSX 10.9 Mavericksでは、ことえり単語登録.appは削除され、システム環境設定のユーザ辞書を編集...になってしまった。
  • もし、Mountain Lionまでの環境があれば、ことえり単語登録.appは、以下の場所に存在するはずである。
    • /System/Library/Input Methods/Kotoeri.app/Contents/Support/WordRegister.app
  • 自分の場合はしっかりTime Capsuleにバックアップが残っていたので、そこから上記WordRegister.appを復元した。
  • そして、WordRegister.appをダブルクリックすると、問題なくことえり単語登録.appが起動した。

  • 「ユーザ辞書」を選択して、辞書 >> テキストに書き出す...メニューを実行すれば、その内容はちゃんと書き出されるのだ。
"まっくぶっく","MacBook","その他の固有名詞"
"まっく","Macintosh","その他の固有名詞"
"まーゔぇりくす","Mavericks","その他の固有名詞"
"まーべりくす","Mavericks","その他の固有名詞"
"あいぱっど","iPad","その他の固有名詞"
"あいふぉん","iPhone","その他の固有名詞"
CoreDataUbiquitySupport
  • 今度は同じ内容であるCoreData形式のユーザ辞書を覗いてみる。
  • フォルダ階層の奥深くに、UserDictionary.dbを見つけられた。
  • UserDictionary.dbとは何なのか?fileコマンドで調べてみると、
$ file ~/Library/Dictionaries/CoreDataUbiquitySupport/zari\~589CXXXX-56XX-5EXX-BFXX-433B24XXXXXX/UserDictionary/B9BFXXXX-F0XX-46XX-BCXX-AE63F7XXXXXX/store/UserDictionary.db 
~/Library/Dictionaries/CoreDataUbiquitySupport/zari\~589CXXXX-56XX-5EXX-BFXX-433B24XXXXXX/UserDictionary/B9BFXXXX-F0XX-46XX-BCXX-AE63F7XXXXXX/store/UserDictionary.db: SQLite 3.x database
  • それは、SQLite3データベースであった。
  • よって、sqlite3コマンドで覗き見れるはず。
$ sqlite3 ~/Library/Dictionaries/CoreDataUbiquitySupport/zari\~589CXXXX-56XX-5EXX-BFXX-433B24XXXXXX/UserDictionary/B9BFXXXX-F0XX-46XX-BCXX-AE63F7XXXXXX/store/UserDictionary.db
SQLite version 3.7.13 2012-07-17 17:46:21
Enter ".help" for instructions
Enter SQL statements terminated with a ";"

sqlite> .tables
Y_UBKVS               Y_UBRANGE             Z_METADATA          
Y_UBMETA              ZUSERDICTIONARYENTRY  Z_PRIMARYKEY        

sqlite> .dump ZUSERDICTIONARYENTRY
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE ZUSERDICTIONARYENTRY ( Z_PK INTEGER PRIMARY KEY, Z_ENT INTEGER, Z_OPT INTEGER, ZAUXINTVALUE1 INTEGER, ZAUXINTVALUE2 INTEGER, ZAUXINTVALUE3 INTEGER, ZAUXINTVALUE4 INTEGER, ZTIMESTAMP INTEGER, ZAUXSTRINGVALUE1 VARCHAR, ZAUXSTRINGVALUE2 VARCHAR, ZAUXSTRINGVALUE3 VARCHAR, ZAUXSTRINGVALUE4 VARCHAR, ZPARTOFSPEECH VARCHAR, ZPHRASE VARCHAR, ZSHORTCUT VARCHAR, ZAUXDATAVALUE BLOB );
INSERT INTO "ZUSERDICTIONARYENTRY" VALUES(8258,1,1,NULL,NULL,NULL,NULL,1390882029,NULL,NULL,NULL,NULL,NULL,'iPhone','あいふぉん',NULL);
INSERT INTO "ZUSERDICTIONARYENTRY" VALUES(9249,1,1,0,0,0,0,1390882166,NULL,NULL,NULL,NULL,NULL,'MacBook','まっくぶっく',NULL);
INSERT INTO "ZUSERDICTIONARYENTRY" VALUES(9250,1,1,0,0,0,0,1390882265,NULL,NULL,NULL,NULL,NULL,'Macintosh','まっく',NULL);
INSERT INTO "ZUSERDICTIONARYENTRY" VALUES(9284,1,1,NULL,NULL,NULL,NULL,1390882301,NULL,NULL,NULL,NULL,NULL,'iPad','あいぱっど',NULL);
INSERT INTO "ZUSERDICTIONARYENTRY" VALUES(10275,1,1,0,0,0,0,1390883427,NULL,NULL,NULL,NULL,NULL,'Mavericks','まーゔぇりくす',NULL);
INSERT INTO "ZUSERDICTIONARYENTRY" VALUES(10276,1,1,0,0,0,0,1390883445,NULL,NULL,NULL,NULL,NULL,'Mavericks','まーべりくす',NULL);
COMMIT;

sqlite> .exit
  • 上記のようなSQL文が記録されており、その中身はデータベースなのである。
  • 順番は異なっているものの、テキストに書き出した内容と同等の中身である。

学習辞書(~/Library/Preferences/com.apple.JapaneseAnalysis/)

  • ~/Library/Preferences/com.apple.JapaneseAnalysis/DictionaryTrainer/(メール.appや連絡先.appなどからの学習)
  • ~/Library/Preferences/com.apple.JapaneseAnalysis/Environment.plist(ことえりの環境設定)
  • ~/Library/Preferences/com.apple.JapaneseAnalysis/InputPrediction.dict(予測変換の学習)
  • ~/Library/Preferences/com.apple.JapaneseAnalysis/LearningDictionary.dict(文節区切りや優先する単語の学習)


ことえりが変換学習した結果が保存されていると思われる。

  • ことえりで確定する時の頻度が高い単語を学習したり、
  • メール.appや連絡先.appの内容などから学習している。

学習辞書の中身を覗いてみる

  • 先ほど復元したことえり単語登録.appを利用するとこで、学習辞書の中身もちゃんと確認できるのだ。

例:LearningDictionary.dict

  • ことえり単語登録.app(WordRegister.app)を起動して、
  • 辞書 >> 新規ユーザ辞書の作成...(command-N)を実行する。
    • 名前:test にしてみた。
  • test辞書が作成され、選択状態になる。
  • 辞書 >> テキストや辞書から取り込む... を実行する。
    • command-shift-Gを押して、以下のパスを指定した。
    • ~/Library/Preferences/com.apple.JapaneseAnalysis
    • LearningDictionary.dictを選択して、開くボタンを押した。
  • test辞書にLearningDictionary.dictの内容が読み込まれる。
  • 読み込みが完了したら、test辞書の内容をテキストに書き出すのだ。
"、","、","普通名詞"
"、","、","数字列接尾語"
"4、","4、","普通名詞"
"おおくはくわねぇ、","多くは食わねぇ、","普通名詞"
"よ、","よ,","普通名詞"
"さむさん、","サムさん、","無品詞"
"「","[","無品詞"
"」","]","無品詞"
"/","・","無品詞"
...(中略)...
  • 上記のような4238語の登録が確認できた。

ユーザ辞書のiCloudとの同期情報

  • ~/Library/Mobile Documents/com~apple~TextInput/Dictionaries/zari~589CXXXX-56XX-5EXx-BFXX-433B24XXXXXX/
  • ~/Library/Mobile Documents/com~apple~TextInput/Dictionaries/mobile~E88CXXXX-22XX-5EXX-AAXX-66EC6DXXXXXX/
  • ~/Library/Mobile Documents/とは、OSXにおけるiCloudの実体である。
  • OSXは、~/Library/Mobile Documents/以下をiCloudと認識して、iCloudサーバーと同期するのだ。
    • その証拠に、Finderで~/Library/Mobile Documents/以下を選択すると、ウィンドウタイトルが常に「iCloud」と表示される。
  • さらに、~/Library/Mobile Documents/com~apple~TextInput/Dictionaries/は、ことえりiOSのユーザ辞書を同期する場所である。
  • 上記のように各端末のユーザーごとにフォルダ分けされて、その中でユーザ辞書が同期される仕組みだ。
    • 「ユーザー名~端末のUUID」というルールのフォルダ名になっている。
    • iPhoneiPadの場合、ユーザ名=mobile となるようだ。

ユーザ辞書のiCloudとの同期情報の中身を覗いてみる

  • 例えば、iPhoneからの同期情報mobile-~E88CXXXX-...を奥深くに辿っていくと、以下のファイルが見つかる。
7AC0414D-C9D3-42C4-9541-7DA7AE39023B.1.cdt
7F1E2035-429B-4672-BE36-DA711F8BD744.1.cdt
1280917B-58F3-4441-9CE8-7F0FC73D165E.1.cdt
receipt.0.cdt
  • それらのファイルは、fileコマンドで確認してみると、見てのとおりZip圧縮されたファイルなのである。
$ file receipt.0.cdt
receipt.0.cdt: Zip archive data, at least v2.0 to extract

$ file 7AC0414D-C9D3-42C4-9541-7DA7AE39023B.1.cdt
7AC0414D-C9D3-42C4-9541-7DA7AE39023B.1.cdt: Zip archive data, at least v2.0 to extract
  • よって、unzipで解凍してみる。
$ unzip receipt.0.cdt
Archive: receipt.0.cdt
 extracting: date
  inflating: kv

$ unzip 7AC0414D-C9D3-42C4-9541-7DA7AE39023B.1.cdt
Archive:  7AC0414D-C9D3-42C4-9541-7DA7AE39023B.1.cdt
  inflating: contents
  • 解凍されたファイルをさらに探る。
$ file date
date: data

$ file kv
kv: ASCII text, with no line terminators

$ file contents
contents: Apple binary property list
  • ファイル形式に合わせて、表示してみた。
    • date
$ hexdump -C date
00000000  17 9b 1d a0 cc b9 d4 41                           |.......A|
00000008
    • kv
$ cat kv
Guest~ 589CXXXX-56XX-5EXX-BFXX-433B24XXXXXX:8:zari~589CXXXX-56XX-5EXX-BFXX-433B24XXXXXX:75:mobile~E88CXXXX-22XX-5EXX-AAXX-66EC6DXXXXXX:29
    • contents
$ plutil -convert xml1 contents
$ cat contents




	cdVersion
	479
	compressedGlobalIDs
	
		0:0:0
	
	deleted
	
	entityNames
	
		UserDictionaryEntry
	
	inserted
	
		0
		
			phrase
			iPad
			shortcut
			あいぱっど
			timestamp
			1390882301
		
	
	kvStr
	Guest~589CXXXX-56XX-5EXX-BFXX-433B24XXXXXX:8:zari~589CXXXX-56XX-5EXX-BFXX-433B24XXXXXX:75:mobile~E88CXXXX-22XX-5EXX-AAXX-66EC6DXXXXXX:29
	modelVersionHash
	SAlQVUhF7208e6_gvZx_zdKx1U1AzKGem3HO2pLKjgY=
	peerIDs
	
		mobile~E88CXXXX-22XX-5EXX-AAXX-66EC6DXXXXXX
		bebe~589CXXXX-56XX-5EXX-BFXX-433B24XXXXXX
		Guest~589CXXXX-56XX-5EXX-BFXX-433B24XXXXXX
	
	peerStates
	
		1
		73
		2
		8
	
	primaryKeys
	
		p10273
	
	transactionDate
	1390882301.459553
	transactionNumber
	29
	updated
	


  • 各端末でユーザ辞書を変更する度に、その変更操作を記録した1ファイル(contens)が追加された。
  • それらのファイルを同期することで、最新のユーザ辞書の状態に同期する仕組みのようだ。

ことえり単語登録.appで辞書を編集するのはNG

  • OSX 10.9 Mavericksでもことえり単語登録.app(WordRegister.app)は、ちゃんと起動する。
  • ことえり単語登録.appなら、以前と同じように品詞の指定も可能。
  • 一方、システム環境設定 >> キーボード >> ユーザ辞書では、登録する時に、単語の品詞は指定できない。
  • そうなると、ことえり単語登録.appでユーザ辞書を編集してみたくなるが、それはやめた方がいい。
  • 自分の環境(OSX 10.9 Marvericks)で確認した結果、ことえり単語登録.appで追加した単語は、ユーザ辞書にしか登録されなかった。
  • 一方、システム環境設定 >> キーボード >> ユーザ辞書で追加した単語は、ユーザ辞書とCoreDataUbiquitySupportの両方に登録された。

ユーザ辞書にしか登録されないと、どうなるか?

  • システム環境設定 >> キーボード >> ユーザ辞書には、ことえり単語登録.appで追加した単語は表示されない。
    • つまり、システム環境設定 >> キーボード >> ユーザ辞書は、CoreDataUbiquitySupportしか見ていないのだ。
  • この状態であっても、MacBook単体で使う限りは、ことえり単語登録.appで追加した単語もちゃんと変換される。しかし、iCloudでは同期されないのだ。
    • つまり、iCloudは、CoreDataUbiquitySupportの変化しか見ていないのだ。


おそらく、過去の互換性を保つためにユーザ辞書を残しているが、いずれCoreDataUbiquitySupportに統一されるのかもしれない。

単語登録のショートカットを作りたい

  • ことえりの単語登録には、以前からcontrol-shift-Nのショートカットが存在した。
  • ところが、Mavericksではこのショートカットがなくなってしまった。すごい不便!
  • というわけで、control-shift-Nのショートカットを復活させるのだ。
  • 但し前項の理由から、起動するのはことえり単語登録.appではなく、システム環境設定 >> キーボード >> ユーザ辞書である。
  • シンプルに、以下のAppleScriptを実行すればOK。(open_ユーザ辞書.scptという名前で保存した)


tell application "System Preferences"
reveal anchor "Text" of pane id "com.apple.preference.keyboard"
activate
end tell

  • 自分の場合は、Quicksilverにcontrol-shift-Nを設定して、上記open_ユーザ辞書.scptを登録しておいた。

ユーザ辞書の書き出しと読み込み

  • Mavericksのシステム環境設定 >> キーボード >> ユーザ辞書には、ことえり単語登録.appにはあった、書き出しと読み込みが見当たらない。
  • どうにかして欲しいと思っていたら、ドラッグ&ドロップで操作する仕組みなのであった。
書き出し
  • 書き出したい単語を選択して、デスクトップなどにドラッグ&ドロップすると、ユーザ辞書.plistとして書き出された。


読み込み
  • 上記ユーザ辞書.plistを、システム環境設定 >> キーボード >> ユーザ辞書にドラッグ&ドロップすると、読み込まれた。


独自の辞書を作る

  • ことえり単語登録.appには、辞書 >> 新規ユーザ辞書の作成... があって、独自の辞書を自由に追加できた。
  • では、Mavericksことえりで独自の辞書を追加したい時には、どうすれば良いのだろう?
  • 実は、以下のようなシンプルなテキストファイルを用意して、
  • システム環境設定 >> キーボード >> 入力ソースの追加辞書:にドラッグ&ドロップすると、辞書に変換され、追加された。
"こい","濃い","無品詞"
"こい","故意","普通名詞"
"かんたんけっさい","かんたん決済","普通名詞"
"あいたじょうたい","空いた状態","普通名詞"
"かのうせいもあるとい","可能性もあると言","普通名詞"
"だれもい","誰も居","普通名詞"
"いかりようれい","以下利用例","普通名詞"
"こう","項","無品詞"
"じつむてきにはどう","実務的にはどう","普通名詞"
"きーうぃんどう","キーウィンドウ","形容動詞"
"きーうぃんどうする","キーウィンドウする","サ変動詞"
"きーうぃんどう","キーウィンドウ","普通名詞"
  • 上記テキストファイルは「よみ,単語,品詞の種類」の順に並んだCSVファイルなのだ。
  • つまり、ことえり単語登録.appが書き出すファイルと、まったく同じ形式なのだ。
  • 削除したい時は、辞書を選択して、二本指タップ、メニューから「ゴミ箱に移動」を実行すればOK。


  • 驚いたことに二本指タップのメニューには「テキストとして書き出す...」も存在する。
  • テキストとして書き出し、必要な編集をして、追加辞書にドラッグ&ドロップ、これで既存の辞書のメンテナンスもちゃんとできる。


参考ページ