2012-03-06 21 views
8

最近オントロジーで作業を始めました。私は自動的に文字列を分類するためにも使いたいオントロジを作成するためにProtegeを使用しています。以下は、非常に基本的なクラス階層を示していますオントロジーベースの文字列の分類

String 
|_ AlphabeticString 
    |_ CountryName 
    |_ CityName 
|_ AlphaNumericString 
    |_ PrefixedNumericString 
|_ NumericString 

は、最終的にSpainのような文字列がCountryNameまたはUE4564として分類されるべきであるPrefixedNumericStringだろう。

しかし、この知識をどのようにモデル化するかはわかりません。文字が英字、数字などであるかどうかを最初に定義してから、既存の文字から単語を作成するか、Regexesを使う方法がありますか?これまでは、String and hasString value "UE4565"のような正確なフレーズに基づいて文字列を分類することしかできませんでした。

または、オントロジの各クラスの正規表現を安全にし、その正規表現を使用してJavaで文字列を分類する方が良いでしょうか?

答えて

2

私はProtegeについて何も知らないが、正規表現を使ってほとんどのケースにマッチさせることができます。唯一の問題は、国と都市の名前を区別することです。私はあなたがどちらかの完全なリストなしでそれを行う方法を見ません。ここで

あなたが使用できるいくつかの式である:

  • AlphabeticString:

    ^[A-Za-z]+\z(ASCII)または^\p{Alpha}+\z(ユニコード)

  • AlphaNumericString:

    ^[A-Za-z0-9]+\z(ASCII)または^\p{Alnum}+\z(ユニコード)

  • PrefixedNumericString:

    ^[A-Za-z]+[0-9]+\z(ASCII)または^\p{Alpha}+\p{N}+\z(ユニコード)

  • NumericString:

    ^[0-9]+\z(ASCII)または^\p{N}+\z(ユニコード)

+0

文字列は都市名と国名の両方にすることができます(概念的にはこれまでの説明に基づいています)。オントロジーは単一の継承を持つ必要はありません。 –

2

特定の文字列でありますインスタンスのために、そのための基本的なアサーションを作るためにいくつかのコードが必要になりますスタンス。そのコード自体には、正規表現の使用が含まれることがあります。これらのアサーションを取得すると、オントロジを使用してその理由を推論することができます。

難しい部分は、モデル化するレベルを決める必要があることです。たとえば、個々の文字について話をしますか?できますが、必ずしも賢明ではありません。あなたはまた、否定の情報が厄介であるという事実から生じる挑戦もあります(そのようなモデルの基本モデルは直観主義、IIRCです)。これは文字列に数字が含まれていることを純粋に数字ではありません。はい、インスタンスにアルファベットの文字が含まれているという主張はありませんが、文字列には文字列がないため、または誰もまだ言わなかったためかどうかはわかりません。このものは難しいです!

あなたが解決しようとしている問題を正確に知っていれば、オントロジを書くのがはるかに簡単です。まず最初に確立する必要のある事実と関係を調べることができます。結局のところ、真実だが無関係であると言える可能性のある事柄の全世界がある(「太陽が帽子を持っているなら、彼は遊ぶために出てくるだろう」)。

6

特にオントロジが大規模/複雑で将来変化する可能性があり、いくつかのエラーが許容されると仮定した場合のアプローチは機械学習です。

このアプローチを利用し、プロセスの概要は、次のようになります。

  1. あなたのオントロジー(以下、いくつかの例)に関連して、各文字列から抽出することができます機能セットを定義します。
  2. 文字列とその真の一致カテゴリの「列車セット」を収集します。
  3. 各文字列から特徴を抽出し、このデータに対して機械学習アルゴリズムを訓練します。
  4. 訓練されたモデルを使用して、新しい文字列を分類します。
  5. 必要に応じて(新しいカテゴリが追加された場合など)、モデルを再登録または更新します。

もっと具体的に説明すると、ここではあなたのオントロジの例に基づいたいくつかの提案があります。

適用可能ないくつかのブール機能:文字列が正規表現と一致するかどうか(たとえば、Qtaxが示唆するもの)。文字列は事前に構築された既知の都市名リストに存在しますか?それは既知の国名リストに存在しますか?大文字の存在。文字列の長さ(ブール値ではない)など

したがって、たとえば、上記の4つの正規表現に一致する合計8つの機能があるとします。 "スペイン"は(1,1,0,0,1,0,1,5)(最初の2つの正規表現にマッチしますが、最後の2つにはマッチしませんが、都市名ですが国名ではなく、大文字と長さが5です)。

この一連の機能は、任意の文字列を表します。

機械学習アルゴリズムをトレーニングしてテストするには、WEKAを使用できます。ルールやツリーベースのアルゴリズムから始めます。 PART、RIDOR、JRIPまたはJ48。

そして、訓練されたモデルは、Java内または外部のコマンドラインとしてWeka経由で使用できます。

明らかに、オントロジーとほぼ1:1のマッチがありますが、タクソノミが大きく複雑になるとすれば、このアプローチはおそらくコスト効率の面で最高のものの1つになるでしょう。

+0

それは私がしばらく読んだ最高の答えでした!実際、私は今自分で試してみたいと思っていました。ありがとう、etov –

1

質問に直接答えるには、特定のトークンが数字、英数字またはアルファベット(ここでは正規表現を使用できます)かどうかを確認してから、それをそのまま分類します。一般に、あなたが探しているアプローチは、トークンの一般化階層または階層的な機能選択(Google it)と呼ばれます。基本的な考え方は、各トークンを別々の要素として扱うことができるということですが、すべてをカバーすることができないため、最良のアプローチではありません。代わりに、トークン間で共通の機能を使用します(たとえば、20001981は区別されるトークンですが、4桁の数字とおそらくは年という共通の機能を共有します)。次に、4桁の数字のクラス、英数字のクラスなどがあります。この一般化のプロセスは、分類アプローチを簡素化するのに役立ちます。

トークンの文字列で始める場合は、前処理(たとえば、句読点や特殊記号の削除、関連性のない単語の削除、ステミングなど)が必要なことがよくあります。しかし、おそらくいくつかの記号(都市と国の間​​の句読点など)を使うことができるので、有用な句読記号のセットを他の記号(#)に割り当てて、それをコンテキストとして使用します

とにかく、オントロジを使った分類の背後にある一般的な考え方です(用語の分類法に基づいています)。これは、既知の国の隣にカンマの隣にある単語です。あなたはまた、約part-of-speech taggingを読むことをお勧めします。

ところで、あなただけ(アルファベット、数字、英数字、)3つのカテゴリを持つようにしたい場合は、実行可能な選択肢はUA4E30が属していることを、より多くの可能性があるもの(edit distanceを使用することですsを英数字または数値カテゴリに変換します。これは、接頭辞付き数値文字列の伝統的な形式には対応していませんか?したがって、未知のトークンを既知のものに変換する各操作(挿入、削除、サブライセンス化)のコストを想定します。

最後に、私があなたのオントロジーを構築するために使用していないProtegeを使用していると言いましたが、WordNetを見てください。

[*]未知のトークンの確率を決定するのに役立つ確率的アプローチがあるため、そのようなイベントの確率はゼロではありません。通常、これは隠れマルコフモデルのコンテキストで行われます。実際、これはetovによって与えられた提案を改善するのに役立ちます。