15

UTF-8、UTF-16、およびUTF-32 Unicode文字標準を使用して、50を超える国際言語でファジーマッチングを実行するシステムを開発しています。これまでのところ、レーベンシュタイン距離を使用して、ドイツ語のUnicode拡張文字の単語のスペルミスを検出することができました。

このシステムを拡張して、Unicodeで表される北京語の表意文字を処理できるようにします。類似の漢字間のレーベンシュタイン距離の計算をどのように実行しますか?

4

2 に答える 2

20

まず、明確にするために、漢字はドイツ語や英語の単語と同じではありません。(「単語」の意味論的または構文的定義を使用して)単語と見なすもののほとんどは、1〜3文字で構成されています。これらの文字シーケンスをUCS-2またはUCS-4コードポイントのシーケンスとして表すことにより、レーベンシュタイン距離をそのような文字シーケンスに適用するのは簡単です。ほとんどの単語は短いので(特に長さが1文字または2文字の単語)、使用が制限される場合があります。

ただし、具体的には個々のキャラクター間の編集距離についての質問なので、別のアプローチが必要だと思いますし、実際には非常に難しいかもしれません。

まず、各文字を、それを構成するコンポーネント/ストロークのシーケンスとして表す必要があります。2つの問題があります:

  • 一部のコンポーネントはそれ自体がさらに小さなコンポーネントで構成されているため、文字を「アトミック」コンポーネントに分解する方法は一意に定義されていません。個々のストロークのレベルまでそれを行う場合は、すべてのストロークの特性(文字内の位置、形状、方向など)が必要になります。私は誰もがこれをしたとは思いません(誰かが私に他のことを言ったら私は最も興味があります)。

  • ストロークまたはコンポーネントを順番に並べる必要があります。明らかな候補は、レキシカで説明されている文字の正規の筆順であり、アニメーションの筆順図を備えた辞書のWebサイトもあります。ただし、私が知っているデータソース(日本語の場合)は、これらのアニメーションをビットマップグラフィックスのシーケンスとして生成します。編集距離の計算に適した形式でストロークのシーケンス(または個々のストロークの名前)を表す人間または機械で読み取り可能なコードを見たことがありません。

ただし、最後に試すことができるのは、文字のグリフをレンダリングし、ある文字を別の文字に変換するために変更する必要のあるピクセル(またはベクトル)の数に基づいて編集距離を計算することです。私はかつて、OCRの事後補正のコンテキストで、ラテン文字と文字の組み合わせ(ピクセルベース)に対してこれを実行しましたが、結果は非常に有望でした。


以下のlarsmansコメントへの簡単な回答:Unicode標準によって定義された2つの関連する概念があります(以下では、6.0バージョンの第12章を参照します)。

  1. 部首とストローク数に基づくインデックス。各漢字はいくつかのコンポーネントで構成されており、そのうちの1つが部首です。部首/ストロークカウントインデックスは、部首(つまり、同じ部首を共有するすべての文字をグループ化)で並べ替えられた文字リストであり、各部首固有のグループは、文字の残りの部分で使用されるストローク数で内部的に並べ替えられます。残念ながら、これでも一意に定義されていません。従来のレキシカによって部首が異なって定義されている文字があり、ストロークのカウントも難しい場合があります。Unicode標準の内容は次のとおりです。

    コードチャートで特定の漢字構成文字をすばやく見つけるために、UnicodeWebサイトで部首ストロークインデックスが提供されています。[...]部首脳卒中情報の最も影響力のある権威は、214の部首を含む18世紀の康熙字辞典です。今日の康熙帝の部首を使用する際の主な問題は、214の康熙帝の部首のいずれかの下で多くの簡体字を分類するのが難しいことです。その結果、さまざまな現代の急進的なセットが導入されました。ただし、一般的に使用されているものはなく、214個の康熙帝ラジカルが最もよく知られています。[...] Unicode部首ストロークチャートは、康熙帝部首に基づいています。Unicode標準は、ラジカルストローク分類のさまざまなソースに従います。特定の文字の部首またはストローク数に関して2つのソースが対立している場合、

    部首/ストロークインデックスが明確で正しいと仮定しても、文字を一連のコンポーネントに変換するための情報源としては十分ではないことに注意してください。これによって完全に記述される文字のコンポーネントは、ラジカル。

  2. 表意文字の記述シーケンス(セクション12.2):Unicodeは、文字の基本コンポーネントのコードポイントを定義し(それらのほとんどは、とにかくスタンドアロン文字として使用できます)、それらを結合して、を記述するコンポーネントのシーケンスを形成するために使用されるコードポイントがあります。より複雑なキャラクターの構成。したがって、これは文字の結合と同じように機能しますが、重要な違いがあります。

    1. コンポーネントの順序は一意に定義されていません
    2. そのようなシーケンスのレンダリングメカニズムの定義はありません
    3. 通常の文字から対応する表意文字の記述シーケンスへのマッピングはありません(ただし、標準では、そのようなマッピングは、Han文字セットのコンパイルに使用されたソースにある程度存在すると記載されています)。

    この標準では、表意文字の記述シーケンスを使用して、既存のコードポイントで表されない複雑またはまれな文字を記述することを提案しています。ただし、通常の文字の代わりに説明シーケンスを使用することは明示的に推奨されていません。

    特に、表意文字記述シーケンスは、データ交換でエンコードされた表意文字の代替グラフィック表現を提供するために使用しないでください。その場合、検索、照合、およびその他のコンテンツベースのテキスト操作は失敗します。

于 2012-09-12T03:20:25.120 に答える
2

fuzzychinese中国語の単語のスペルミスを修正するためにPythonパッケージを作成しました。

@jogojapanが言ったように、本当にレーベンシュタイン距離を計算したい場合は、部首ストロークなどのサブ文字構造を使用する方が理にかなっています。Stroke()またはRadical()クラスfromを使用fuzzychineseして文字を分解し、レーベンシュタイン距離を計算できます。

ただし、レーベンシュタイン距離が中国語のスペルミスを修正するのに適しているかどうかはわかりません。私が書いたパッケージでは、n-gramストロークのtf-idfベクトルを計算し、コサイン類似度を使用して単語を照合しました。

于 2019-11-14T22:50:51.930 に答える