Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rebuilding #20

Closed
10 tasks done
windchime-yk opened this issue Oct 5, 2023 · 10 comments · Fixed by #25
Closed
10 tasks done

Rebuilding #20

windchime-yk opened this issue Oct 5, 2023 · 10 comments · Fixed by #25
Labels
Priority: High Type: Refactoring バグの修正も機能の追加も行わないコード変更

Comments

@windchime-yk
Copy link
Owner

windchime-yk commented Oct 5, 2023

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

目標

  • 対応言語は日本語のみ(今後、ここも拡張できるように考える 多言語化はきりがないので、一旦日本語のみ)
  • 最初期の対応IMEは以下4つとする
    • Google IME
    • macOS Japanese Input Method
    • Microsoft IME
    • Gboard
  • IMEの設定をImeConfigに集約する
  • ImeConfig[]に項目を追加するだけで、簡単に新規IMEに対応できるようにする
  • ユーザーから渡されたJSONデータを受け取り、様々なIMEファイルに出力する
  • デスクトップアプリの提供をMVPとする
  • コア機能を切り離す
  • コア機能を使ったGitHub Actions利用例を出す
  • quicktypeを使ってJSONスキーマを提供する

タスク

設計

  • 各IMEの対応品詞の調査
  • IME設定の整理
  • 品詞対応方法の検討
  • IME制御品詞である抑制単語への対応
  • 各IMEのファイル形式サンプル貼付
  • ユーザーに提供するJSONスキーマの検討
  • シーケンス図の作成

構築

  • コア機能の書き直し
  • CLIの作成
  • JSON Schemaの出力
@windchime-yk windchime-yk added Priority: High Type: Refactoring バグの修正も機能の追加も行わないコード変更 labels Oct 5, 2023
@windchime-yk windchime-yk pinned this issue Oct 5, 2023
@windchime-yk
Copy link
Owner Author

windchime-yk commented Oct 5, 2023

各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
Copy link
Owner Author

windchime-yk commented Oct 5, 2023

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
Copy link
Owner Author

windchime-yk commented Oct 6, 2023

品詞対応方法の検討

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

  • 各種IMEの品詞ラベルは統一されていないため、ユーザー側にえげつない量の選択肢が出る
  • 一括でファイル出力することも検討しているので、対応していない品詞ラベルがundefinedになる懸念がある

そこで、統一的に品詞ラベルを提供する品詞ラベル辞書を内部で持ち、その中に各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
Copy link
Owner Author

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

@windchime-yk
Copy link
Owner Author

windchime-yk commented Oct 7, 2023

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

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

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

@windchime-yk
Copy link
Owner Author

windchime-yk commented Oct 7, 2023

各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
Copy link
Owner Author

windchime-yk commented Oct 8, 2023

ユーザーに提供する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
Copy link
Owner Author

windchime-yk commented Oct 8, 2023

シーケンス図の作成

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: 圧縮ファイルのダウンロードリンクを生成
Loading

@windchime-yk
Copy link
Owner Author

windchime-yk commented Dec 30, 2023

アプリについて

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

Electronの選定理由

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

Webアプリを作るか

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

@windchime-yk windchime-yk mentioned this issue Jan 1, 2024
@windchime-yk
Copy link
Owner Author

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

@windchime-yk windchime-yk unpinned this issue Jan 6, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Priority: High Type: Refactoring バグの修正も機能の追加も行わないコード変更
Projects
Status: Done
Development

Successfully merging a pull request may close this issue.

1 participant