windchime-yk / bid

build IME dictionary
https://deno.land/x/bid
MIT License
4 stars 1 forks source link

Rebuilding #20

Closed windchime-yk closed 9 months ago

windchime-yk commented 1 year ago

現在のbIdは拡張が難しいため、拡張性を高めるために再構築する。

目標

タスク

設計

構築

windchime-yk commented 1 year ago

各IMEの対応品詞の調査

Google IME

Details - 名詞 - 短縮よみ - サジェストのみ - 固有名詞 - 人名 - 姓 - 名 - 組織 - 地名 - 名詞サ変 - 名詞形動 - 数 - アルファベット - 記号 - 顔文字 - 副詞 - 連体詞 - 接続詞 - 感動詞 - 接頭語 - 助数詞 - 接尾一般 - 接尾人名 - 接尾地名 - 動詞カ行五段 - 動詞ガ行五段 - 動詞サ行五段 - 動詞タ行五段 - 動詞ナ行五段 - 動詞バ行五段 - 動詞マ行五段 - 動詞ラ行五段 - 動詞ワ行五段 - 動詞ハ行四段 - 動詞一段 - 動詞カ変 - 動詞サ変 - 動詞ザ変 - 動詞ラ変 - 形容詞 - 終助詞 - 句読点 - 独立語 - 抑制単語

macOS Japanese Input Method

https://support.apple.com/ja-jp/guide/japanese-input-method/jpim10211/mac

Details - 普通名詞 - 人名 - 姓 - 名 - その他の人名 - 組織名 - 単純地名 - 接尾語付き地名 - その他の固有名詞 - サ変名詞 - 形動名詞 - 副詞 - 連体詞 - 接続詞 - 感動詞 - 数字列接頭語 - 数字列接尾語 - 人名接尾語 - 地名接尾語 - 組織名接尾語 - カ行五段 - ガ行五段 - サ行五段 - タ行五段 - ナ行五段 - バ行五段 - マ行五段 - ラ行五段 - ワ行五段 - 五段動詞 - 一段動詞 - サ変動詞 - ザ変動詞 - 形容詞 - 成句 - 無品詞

Microsoft IME

Details - 名詞 - 人名 - 姓 - 名 - 地名 - 短縮よみ - 顔文字 - さ変形動名詞 - 固有名詞 - 形容詞 - 形容動詞 - 副詞 - 連体詞 - 接続詞 - 感動詞 - 慣用句 - さ変名詞 - ざ変名詞 - 形動名詞 - 副詞的名詞 - 接頭語 - 姓名接頭語 - 地名接頭語 - 接尾語 - 姓名接尾語 - 地名接尾語 - 助数詞 - あわ行五段 - か行五段 - が行五段 - さ行五段 - た行五段 - な行五段 - ば行五段 - ま行五段 - ら行五段 - 一段動詞

Gboard

品詞なし(!?)

windchime-yk commented 1 year ago

IME設定の整理

interface ImeConfig {
  name: string // ex. "Google IME"
  lang: string // ex. "ja-JP"
  encoding: "" // ex. "UTF-16LE"
  dataType: "" // ex. "CSV"
  hasWordClass: boolean // ユーザー辞書内に品詞欄があるか
  hasWordIgnore?: boolean // 抑制単語を品詞に持っているか
}
windchime-yk commented 1 year ago

品詞対応方法の検討

当初は、ImeConfig配下にsupportedWordclassesというプロパティを置き、そこで対応する予定だった。 ただ、これだと以下の問題が出る。

そこで、統一的に品詞ラベルを提供する品詞ラベル辞書を内部で持ち、その中に各IMEの品詞ラベルを記載することでundefinedの発生を抑止する。 bId側の品詞ラベルはなるべく詳細なものを採用し、そのラベルを持っていない各IMEはフォールバックとして抽象的な品詞を使う方針とする。 また、ユーザーによっては独自の品詞マッピングを使いたいという人もいると思うので、そこの拡張性も検討する。

bIdの品詞マッピング

GBoardは品詞を設定する欄が存在しないので省く。

Details - 普通名詞 - Google:名詞 - macOS:普通名詞 - Microsoft:名詞 - 固有名詞 - Google:固有名詞 - macOS:その他の固有名詞 - Microsoft:固有名詞 - サ変名詞 - Google:名詞サ変 - macOS:サ変名詞 - Microsoft:さ変名詞 - ザ変名詞 - Google:名詞 - macOS:普通名詞 - Microsoft:ざ変名詞 - サ変動詞 - Google:動詞サ変 - macOS:サ変動詞 - Microsoft:形容動詞(要検討) - ザ変動詞 - Google:動詞ザ変 - macOS:ザ変動詞 - Microsoft:形容動詞(要検討) - 形容詞 - Google:形容詞 - macOS:形容詞 - Microsoft:形容詞 - 形動名詞 - Google:名詞形動 - macOS:形動名詞 - Microsoft:形動名詞 - 副詞 - Google:副詞 - macOS:副詞 - Microsoft:副詞 - 連体詞 - Google:連体詞 - macOS:連体詞 - Microsoft:連体詞 - 接続詞 - Google:接続詞 - macOS:接続詞 - Microsoft:接続詞 - 感動詞 - Google:感動詞 - macOS:感動詞 - Microsoft:感動詞 - カ行五段動詞 - Google:動詞カ行五段 - macOS:カ行五段 - Microsoft:か行五段 - ガ行五段動詞 - Google:動詞ガ行五段 - macOS:ガ行五段 - Microsoft:が行五段 - サ行五段動詞 - Google:動詞サ行五段 - macOS:サ行五段 - Microsoft:さ行五段 - タ行五段動詞 - Google:動詞タ行五段 - macOS:タ行五段 - Microsoft:た行五段 - ナ行五段動詞 - Google:動詞ナ行五段 - macOS:ナ行五段 - Microsoft:な行五段 - バ行五段動詞 - Google:動詞バ行五段 - macOS:バ行五段 - Microsoft:ば行五段 - マ行五段動詞 - Google:動詞マ行五段 - macOS:マ行五段 - Microsoft:ま行五段 - ラ行五段動詞 - Google:動詞ラ行五段 - macOS:ラ行五段 - Microsoft:ら行五段 - ワ行五段動詞 - Google:動詞ワ行五段 - macOS:ワ行五段 - Microsoft:あわ行五段 - 一段動詞 - Google:動詞一段 - macOS:一段動詞 - Microsoft:一段動詞 - 短縮よみ - Google:短縮よみ - macOS:無品詞 - Microsoft:短縮よみ - 人名 - Google:人名 - macOS:人名 - Microsoft:人名 - 人名接頭語 - Google:接頭語 - macOS:普通名詞 - Microsoft:姓名接頭語 - 人名接尾語 - Google:接尾人名 - macOS:人名接尾語 - Microsoft:姓名接尾語 - 姓 - Google:姓 - macOS:姓 - Microsoft:姓 - 名 - Google:名 - macOS:名 - Microsoft:名 - 組織名 - Google:組織 - macOS:組織名 - Microsoft:名詞 - 組織名接頭語 - Google:接頭語 - macOS:普通名詞 - Microsoft:接頭語 - 組織名接尾語 - Google:接尾一般 - macOS:組織名接尾語 - Microsoft:接尾語 - 地名 - Google:地名 - macOS:単純地名 - Microsoft:地名 - 地名接頭語 - Google:接頭語 - macOS:普通名詞 - Microsoft:地名接頭語 - 地名接尾語 - Google:接尾地名 - macOS:地名接尾語 - Microsoft:地名接尾語 - 数字 - Google:数 - macOS:普通名詞 - Microsoft:名詞 - 数字接頭語 - Google:接頭語 - macOS:数字列接頭語 - Microsoft:接頭語 - 数字接尾語 - Google:助数詞 - macOS:数字列接尾語 - Microsoft:助数詞 - アルファベット - Google:アルファベット - macOS:無品詞 - Microsoft:名詞 - 記号 - Google:記号 - macOS:無品詞 - Microsoft:名詞 - 顔文字 - Google:顔文字 - macOS:無品詞 - Microsoft:顔文字 - 慣用句 - Google:固有名詞 - macOS:成句 - Microsoft:慣用句
windchime-yk commented 1 year ago

基本的に日本語のみ対応を目指したモジュールなのに英語なので、ここからIssueは日本語で書く方針に切り替える

windchime-yk commented 1 year ago

IME制御品詞である抑制単語への対応

Google IMEやATOKなど、一部のIMEは抑制単語という品詞を持ち、これによって検索候補に表示しないよう制御している。 これはIME制御の品詞でありフォールバックでなんとかなるものでもないため、品詞辞書とは別の対応が必要。

まず、抑制単語に対応しているIMEはImeConfigに記載することで判別可能にする。 次に、抑制単語にしたい単語はignoreプロパティをtrueにすることで、それを抑制単語として登録するように制御する。

windchime-yk commented 1 year ago

各IMEのファイル形式サンプル貼付

Google IME

かみつばき   神椿  組織  
かみつばき   噛み椿 名詞  
かふ  花譜  人名  
かみつばきけんせつちゅう    神椿建設中。  固有名詞    

macOS Japanese Input Method

https://support.apple.com/ja-jp/guide/japanese-input-method/jpim10228/mac

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
  <dict>
    <key>phrase</key>
    <string>雲母坂</string>
    <key>shortcut</key>
    <string>きららざか</string>
  </dict>
  <dict>
    <key>phrase</key>
    <string>Props</string>
    <key>shortcut</key>
    <string>こどうぐ</string>
  </dict>
</array>
</plist>

ことえり時代のCSV形式でも導入可能なため、bIdではCSV形式のみサポートする。

きららざか, 雲母坂, 普通名詞
こどうぐ, Props, 普通名詞

Microsoft IME

冒頭数行にわたる!で始まる部分は省いた。

あああああ   あいえうえ   姓名接頭語
ええええ    あいえい    あわ行五段
tttt    ああああああ  ま行五段
てすと テスト 短縮よみ    あああああ
てすと テスト2    短縮よみ    あああああ
てすと テスト3    姓   えええええ
てすと テスト4    短縮よみ    うううううう
てすと テスト6    人名
てすと てすと さ行五段

GBoard

# Gboard Dictionary version:1
たんこ 単語  ja-JP
どろ  吐露  ja-JP
windchime-yk commented 1 year ago

ユーザーに提供するJSONスキーマの検討

以下をquicktypeでJSONスキーマにする想定

IMEの型定義

/** 対応しているIME */
type ImeType = "Google IME" | "macOS IME" | "Microsoft IME" | "GBoard";

品詞の型定義

/** bIdで利用可能な品詞名 */
type Wordclass = "" | "";

ユーザー辞書

/**
 * ユーザー辞書の型定義
 */
type UserDictionary = {
  /** 品詞 */
  type: Wordclass;
  /** 対象文言 */
  word: string;
  /** 読み方 */
  reading: string;
  /** 抑制単語かどうか */
  isSuppress?: boolean;
  /** サジェストのみに表示するかどうか */
  isSuggest?: boolean;
  /** 対象文言についての説明 */
  description?: string;
}

品詞マッピング

/** 
 * 品詞マッピングの型定義
 */
type WordclassMapping = {
  /** bIdで利用する品詞 */
  [word in Wordclass]: {
    /** 各IMEの対応品詞 */
    [ime in Exclude<ImeType, "GBoard">]: string;
  }
}
windchime-yk commented 1 year ago

シーケンス図の作成

sequenceDiagram
  participant user as ユーザー
  participant app as アプリ画面
  participant core as コア機能

  user ->> app: JSONないしCSVをファイルで渡す
  app ->> core: ファイルからデータを抜き出して渡す
  core ->> core: ファイル拡張子を確認
  break ファイルが.jsonや.csv以外の場合
    core -->> app: "detail: file-type-error"を返却
    app -->> user: ファイル形式エラーとして画面に表示 
  end

  core ->> core: ファイルデータをJSONに変換

  break JSONデータに想定外のプロパティが含まれていた場合
    core -->> app: "detail: json-property-error"を返却
    app -->> user: データ形式エラーとして画面に表示 
  end

  loop
    core ->> core: JSONデータを各IMEのテキストデータに整形
    core ->> core: テキストデータをファイルに出力
  end

  core -->> app: ファイルを圧縮し、圧縮ファイルを返却
  app -->> user: 圧縮ファイルのダウンロードリンクを生成
windchime-yk commented 10 months ago

アプリについて

コア機能をDenoで書いてdntでNode.jsモジュールに変換、それをElectronで使う形にしたい

Electronの選定理由

Electronはパッケージングが充実しており、各OS認証も標準で持っている。 webview_denoはその辺りのサポートがないので、バックオフィスなどで利用することを想定すると、選定しづらい

Webアプリを作るか

アプリをダウンロードせずに使いたい需要もあると思っているので、作成予定。

windchime-yk commented 9 months ago

アプリについては重いタスクになるので、別のIssueで作成する