4

GoldenDict (www.goldendict.org、詳細については Google Play ストアも参照) の精神で、Firefox OS 用の辞書アプリを作成しました: http://tuxor1337.github.io/firedictおよびhttps://marketplace.firefox。 com/app/firedict

ffosのアプリはHTML、CSS、JavaScript(WebAPIなど)をベースにしているため、すべてゼロから書く必要がありました。最初に、JavaScript で StarDict 辞書への同期および非同期アクセス用の基本的なライブラリを作成しました: https://github.com/tuxor1337/stardict.js

アプリは今のところ安定していると言えますが、全体的なパフォーマンスはまだ少し遅いです. 一部の辞書では、ほぼ 1,000,000 エントリの単語のリストがあります。それは巨大です。インデックス作成には非常に長い時間がかかり (辞書ごとに最大数分)、検索も必要です。現時点では、単語は IndexedDB オブジェクト ストアに格納されています。別の代替手段はありますか?現在のソリューション (バイナリ検索を使用してアクセスおよび挿入される単語) では、全体的なエクスペリエンスはかなり遅くなります。IndexedDB によるロケールソートのサポートがあれば、おそらくもっと速くなるでしょう...実際、用語そのものを DB に保存するのではなく、オフセットのみを *.syn/*.idx ファイルに保存します。そうすることでいくらかのメモリを節約したいと思っています。もちろん、この構成ではIDBソート機能を使用できません...

一部のデバイス (ZTE Open など) では OOM が原因でアプリがカーネルによって強制終了されるため、メモリ内で並べ替えを行うのは最善の方法ではない可能性があります。500,000 を超えるエントリを持つディクショナリは、メモリ内で確実に 100 MB を超えます。(これはエントリあたりわずか 200 バイトであり、キーワード文字列が UTF-8 であると仮定すると、すぐに 100 MB を超えます...)

GitHub のプロジェクトに自由に直接貢献してください。そうでない場合は、上記の問題についてアドバイスをいただければ幸いです。

4

1 に答える 1

2

私は、あなたの stardict プロジェクトと同様に、 MDict パーサー ( https://github.com/fengdh/mdict-js ) の純粋な Javascript 実装に取り​​組んでいます。MDict は、window/linux/ios/android/windows phone で広くサポートされている、リッチ フォーマット (埋め込み画像/オーディオ/css など) を備えたもう 1 つの一般的な辞書フォーマットです。共有したいアイデアがいくつかあります。将来的に stardict.js を改善するために適用していただければ幸いです。

MDict ディクショナリ ファイル (mdx/mdd) は、キーワードとレコードを (オプションで圧縮された) ブロックに分割します。各ブロックには約 2000 のエントリが含まれ、キーワード ブロック インデックス テーブルとレコード ブロック インデックス テーブルも提供され、すばやく検索できます。そのコンパクトなデータ構造により、小さなプリロード インデックス テーブルを使用してディクショナリ ファイルを直接スキャンする MDict パーサーを実装できますが、 IndexDB は必要ありません

  • 各キーワード ブロック インデックスは次のようになります。

    {num_entries: .., 
     first_word: .., 
     last_word: .., 
     comp_size: ..,    // size in compression 
     decomp_size: ..,  // size after decompression
     offset: ..,       // offset in mdx file
     index: ..
    }
    
  • キーブロックでは、各エントリは [キーワード、オフセット] のペアです。

  • 各レコード ブロック インデックスは次のようになります。

    {comp_size: ..,    // size in compression 
     decomp_size: ..,  // size after decompression
    }
    
  • 単語が与えられたら、バイナリ検索を使用して、その単語を含む可能性のあるキーワード ブロックを見つけます。

  • キーワード ブロックをスライスし、その中のすべてのキーを読み込み、一致するものを除外して、そのレコード オフセットを取得します。
  • 二分探索を使用して、単語のレコードを含むレコード ブロックを見つけます。
  • レコード ブロックをスライスし、そのレコード (テキスト内の定義または ArrayBuffer 内のリソース) を直接取得します。

各ブロックには約 2000 エントリしか含まれていないため、100 ミリ秒以内に 100K ~ 1M の辞書エントリから単語を検索するのに十分な速度であり、人間との対話にはかなりの価値があります。mdict-js はファイルの先頭のみを解析します。非常に高速でメモリ使用量が少ないです。

同様に、ワイルドカードを使用しても、特定のフレーズの隣接する単語のリストを取得できます。

ここで私のオンライン デモをご覧ください: http://fengdh.github.io/mdict-js/ (ローカル MDict 辞書を選択する必要があります: mdx + オプションの mdd ファイル)

于 2014-08-04T01:45:41.327 に答える