Code Monkey home page Code Monkey logo

akaza's Introduction

ibus-akaza

Yet another kana-kanji-converter on IBus, written in Rust.

統計的かな漢字変換による日本語IMEです。 Rust で書いています。

現在、開発途中のプロダクトです。非互換の変更が予告なくはいります

モチベーション

いじりやすくて ある程度 UIが使いやすいかな漢字変換があったら面白いなと思ったので作ってみています。 「いじりやすくて」というのはつまり、Hack-able であるという意味です。

モデルデータを自分で生成できて、特定の企業に依存しない自由なかな漢字変換エンジンを作りたい。

特徴

  • UI/Logic をすべて Rust で書いてあるので、拡張が容易です。
  • 統計的かな漢字変換モデルを採用しています
    • 言語モデルの生成元は日本語 Wikipedia と青空文庫です。
      • 形態素解析器 Vibrato で分析した結果をもとに 2gram 言語モデルを構築しています。
      • 利用者の環境で 1 から言語モデルを再生成することが可能です。
  • ユーザー環境で、利用者の変換結果を学習します(unigram, bigramの頻度を学習します)

Dependencies

Runtime dependencies

  • ibus 1.5+
  • marisa-trie
  • gtk4

Build time dependencies

  • rust

Supported environment

  • Linux 6.0 以上
  • ibus 1.5 以上
  • リトルエンディアン環境

Install 方法

モデルファイルをダウンロードして展開してください。

sudo mkdir -p /usr/share/akaza/model/default/
curl -L https://github.com/akaza-im/akaza-default-model/releases/download/<<VERSION>>/akaza-default-model.tar.gz | sudo tar xzv --strip-components=1 -C /usr/share/akaza/model/default/

ibus-akaza をインストールしてください。

rustup install stable
make
sudo make install
ibus restart
ibus engine akaza

設定方法

Keymap の設定

Akaza は典型的には以下の順番で探します。

  1. ~/.local/share/akaza/keymap/{KEYMAP_NAME}.yml
  2. /usr/local/share/akaza/keymap/{KEYMAP_NAME}.yml
  3. /usr/share/akaza/keymap/{KEYMAP_NAME}.yml

このパスは、XDG ユーザーディレクトリ の仕様に基づいています。 Akaza は Keymap は XDG_DATA_HOMEXDG_DATA_DIRS からさがします。 XDG_DATA_HOME は設定していなければ ~/.local/share/ です。XDGA_DATA_DIR は設定していなければ /usr/local/share:/usr/share/ です。

RomKan の設定

ローマ字かなマップも同様のパスからさがします。

  1. ~/.local/share/akaza/romkan/{KEYMAP_NAME}.yml
  2. /usr/local/share/akaza/romkan/{KEYMAP_NAME}.yml
  3. /usr/share/akaza/romkan/{KEYMAP_NAME}.yml

model の設定

model は複数のファイルからなります。

  • unigram.model
  • bigram.model
  • SKK-JISYO.akaza

この切り替えは以下のようなところから読まれます。

  • ~/.local/share/akaza/model/{MODEL_NAME}/unigram.model
  • ~/.local/share/akaza/model/{MODEL_NAME}/bigram.model
  • ~/.local/share/akaza/model/{MODEL_NAME}/SKK-JISYO.akaza

keymap, romkan と同様に、XDG_DATA_DIRS から読むこともできます。

FAQ

最近の言葉が変換できません/固有名詞が変換できません

流行り言葉が入力できない場合、jawiki-kana-kanji-dict の利用を検討してください。 Wikipedia から自動的に抽出されたデータを元に SKK 辞書を作成しています。 Github Actions で自動的に実行されているため、常に新鮮です。

一方で、自動抽出しているために変なワードも入っています。変なワードが登録されていることに気づいたら、github issues で報告してください。

人名が入力できません。など。

必要な SKK の辞書を読み込んでください。 現時点では config.yml を手で編集する必要があります。

https://skk-dev.github.io/dict/

THANKS TO

akaza's People

Contributors

omasanori avatar pklion avatar renovate[bot] avatar tkng avatar tokuhirom avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

akaza's Issues

ibus の未実装部分

  • 全角カタカナモード

  • 全角アルファベットモード

  • 半角カタカナモード

  • 後から文字モードを変更する機能。F6〜F10

  • 0〜9のボタンおしたときに設定する

  • page_up, page_down の設定

  • do_property_activate

  • do_reset

  • do_page_up

  • do_page_down

  • do_cursor_up

  • do_cursor_down

  • do_property_activate

Dependency Dashboard

This issue lists Renovate updates and detected dependencies. Read the Dependency Dashboard docs to learn more.

This repository currently has no open or pending branches.

Detected dependencies

cargo
akaza-data/Cargo.toml
  • tempfile 3
  • anyhow 1.0.68
  • log 0.4.17
  • env_logger 0.10.0
  • clap 4.1.1
  • clap-verbosity-flag 2.0.0
  • encoding_rs 0.8.31
  • regex 1
  • kelp 0.4.0
  • lcs 0.2.0
  • chrono 0.4.23
  • vibrato 0.3.3
  • walkdir 2
  • rayon 1.6.1
ibus-akaza/Cargo.toml
  • tempfile 3
  • anyhow 1.0.68
  • log 0.4.17
  • env_logger 0.10.0
  • clap 4.1.1
  • clap-verbosity-flag 2.0.0
  • kelp 0.4.0
  • regex 1
  • cc 1.0.78
ibus-sys/Cargo.toml
  • log 0.4.17
libakaza/Cargo.toml
  • chrono 0.4.23
  • regex 1
  • log 0.4.17
  • env_logger 0.10.0
  • tempfile 3
  • anyhow 1.0.68
  • half 2.2.1
  • kelp 0.4.0
  • xdg 2.4.1
  • encoding_rs 0.8.31
  • cedarwood 0.4.6
  • serde 1.0.152
  • serde_yaml 0.9.16
marisa-sys/Cargo.toml
  • tempfile 3
  • anyhow 1.0.68
  • cc 1.0.78
github-actions
.github/workflows/ci-simple.yml
  • actions/checkout v3
  • actions/cache v3
.github/workflows/model.yml
  • actions/checkout v3
  • actions/cache v3
  • softprops/action-gh-release v1

  • Check this box to trigger a request for Renovate to run again on this repository

変な変換候補

い 胃/意/異/医/位/井/伊/委/衣/居/射/威/亥/夷/姨/洟/痍/維/帷/惟/唯/韋/違/偉/緯/幃/圍/囲/慰/尉/熨/蔚/萎/痿/逶/矮/謂/渭/椅/倚/猗/為/爲/彙/彝/彜/以/苡/詒/貽/怡/遺/依/易/畏/移/堰/莞/詑/胆/猪/鮪/揖/噫/已/恚/懿/矣/肄/頤/饐/鰄/醫/囗/五/ゐ/如/斐/鋳/鑄/忌/偽/僞/李/言い/良い/云い/可い/好い/善い/謂い/射い/居い/鋳い/将い/率い/鑄い/い/イ/云/往/快/煎/藺/行/言/逝

辞書に変な候補が入っている問題。
「好い」が登録されているのが謎。

out of bounds access

thread 'main' panicked at 'Out of bounds access', ibus-akaza/src/context.rs:495:24
stack backtrace:
   0: rust_begin_unwind
             at /rustc/69f9c33d71c871fc16ac445211281c6e7a340943/library/std/src/panicking.rs:575:5
   1: core::panicking::panic_fmt
             at /rustc/69f9c33d71c871fc16ac445211281c6e7a340943/library/core/src/panicking.rs:65:14
   2: core::panicking::panic_display
             at /rustc/69f9c33d71c871fc16ac445211281c6e7a340943/library/core/src/panicking.rs:139:5
   3: core::panicking::panic_str
             at /rustc/69f9c33d71c871fc16ac445211281c6e7a340943/library/core/src/panicking.rs:123:5
   4: core::option::expect_failed
             at /rustc/69f9c33d71c871fc16ac445211281c6e7a340943/library/core/src/option.rs:1879:5
   5: core::option::Option<T>::expect
             at /rustc/69f9c33d71c871fc16ac445211281c6e7a340943/library/core/src/option.rs:741:21
   6: <alloc::collections::vec_deque::VecDeque<T,A> as core::ops::index::Index<usize>>::index
             at /rustc/69f9c33d71c871fc16ac445211281c6e7a340943/library/alloc/src/collections/vec_deque/mod.rs:2939:9
   7: ibus_akaza::context::AkazaContext::build_string
             at ./dev/akaza/ibus-akaza/src/context.rs:495:24
   8: ibus_akaza::context::AkazaContext::refresh
             at ./dev/akaza/ibus-akaza/src/context.rs:568:24
   9: ibus_akaza::context::AkazaContext::_update_candidates
             at ./dev/akaza/ibus-akaza/src/context.rs:524:9
  10: ibus_akaza::context::AkazaContext::extend_clause_right
             at ./dev/akaza/ibus-akaza/src/context.rs:720:9
  11: ibus_akaza::commands::ibus_akaza_commands_map::{{closure}}
             at ./dev/akaza/ibus-akaza/src/commands.rs:52:9
  12: core::ops::function::FnOnce::call_once
             at /rustc/69f9c33d71c871fc16ac445211281c6e7a340943/library/core/src/ops/function.rs:251:5
  13: ibus_akaza::context::AkazaContext::run_callback_by_name
             at ./dev/akaza/ibus-akaza/src/context.rs:407:13
  14: ibus_akaza::context::AkazaContext::process_key_event
             at ./dev/akaza/ibus-akaza/src/context.rs:253:20
  15: ibus_akaza::process_key_event
             at ./dev/akaza/ibus-akaza/src/main.rs:34:5
  16: ibus_akaza_engine_process_key_event
             at ./dev/akaza/ibus-akaza/wrapper.c:64:10
  17: <unknown>
  18: g_closure_invoke
  19: <unknown>
  20: g_signal_emit_valist
  21: g_signal_emit
  22: <unknown>
  23: <unknown>
  24: g_main_context_dispatch
  25: <unknown>
  26: g_main_loop_run
  27: ibus_main
  28: ibus_akaza::main
             at ./dev/akaza/ibus-akaza/src/main.rs:127:9
  29: core::ops::function::FnOnce::call_once
             at /rustc/69f9c33d71c871fc16ac445211281c6e7a340943/library/core/src/ops/function.rs:251:5

IPCエンジン機能

外部コマンドを起動し、標準入出力経由でやりとりする、みたいな感じで実装できるといいかも。
プロトコルは行ベースのjsonプロトコルを想定

marisa 以外のなにかをつかうように変更する。

現在、モデルファイルを marisa で作成しているが、もはや別に TRIE ではなく KVS としてつかっているので他のなにかにしたい。

要件:

  • pure rust
    • C/C++ ライブラリへの依存がない
  • エンディアンに依存しない

https://github.com/estebank/galvanize cdbのファイルとかもあるので、こういうの使うんでもいいかも。
CDBは32bit little endian 固定なので。

Originally posted by @tokuhirom in #70 (comment)

抑制単語機能

特定の単語が出ないように設定できるといいかも。

google input cgi api 対応

例えば、変換中に f1を押した場合に、google input cgi api を呼び出す、みたいな機能があったらいいかも。
設定でオンオフ切り換えられる感じで。
新語をそこから拾えればなにかと良いかも知れない。

わたしのなまえはなかのです、が変換できなくなっている

私/の/名前/は/中/の/です

↑となっている。

↓wfreqにはちゃんと取れている。

~/dev/akaza/akaza-data/ grep '/なかの\s' work/vibrato-ipadic.wfreq
ナカノ/なかの   57
中ノ/なかの     146
中之/なかの     97
中埜/なかの     74
中野/なかの     7952
仲の/なかの     1
仲ノ/なかの     18
仲之/なかの     42
仲野/なかの     184
名香野/なかの   1

かな入力対応

かな入力ってしたことないからよくわかってない。。

テーブルのハードコードを避ける

一方で、現状でもテーブルを定義するRustコードを書き換えてリビルドすればテーブルの変更は可能で、hackableなかな漢字変換エンジンとしてはそれで充分という考え方もある。

他方で、将来Akazaが各ディストリビューションのパッケージとして配布されるようになると、自分でAkazaをビルドしない利用者が発生する。これはAkazaにとって悪いことではないが、そのような利用者はハードコードされたテーブルを変更できない。テーブルのハードコードを避けて外部ファイルに追い出すか、設定でテーブルの追記や置き換えができるとこのような利用者にとって便利。

数の変換機能

例えば、/4628/ を変換したときに
四六二八、四千六百二十八などの候補が mozc では出る。
同様の機能があっても良さそう。

このような、動的な変換候補を実装できる機構があっても良いと思う。
SKK で LISP でやっていたようなもの?とはいえ、LISP が実行できるレベルの柔軟性は本来必要ではないと思うので、rust の側で変換ロジックを持ちつつ、surface としてはなんらかの識別子を入れるといった具合?

WordNode に surface とは別に、dynamic_conversion_identifier 的なものを入れるのが良いのだろうか?

コーパス学習機能を頻度ベースにする

現在の実装では、logをかけた後の数字を直接いじっているが、これは正統性が無い処理。
wfreqとbigramの頻度ファイルを元に調整していくスタイルに変更したい。

GUIの設定画面

  • 単語の追加削除
  • バージョン情報の表示
  • ローマ字テーブルの編集
  • ショートカットキーの編集

などなどができるようにしたい。Portable な GUI ライブラリが使えると良さそう。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.