25

私は、通常の(形式言語理論の意味での)文法によって明確に生成された、人間が読める冗長な文字列を多数含む大規模な公開データセットの分析に取り組んでいます。

これらの文字列のセットを1つずつ見て、パターンを確認するのはそれほど難しくありません。残念ながら、これらの一意の文字列は33のカテゴリと1714のサブカテゴリに分割されており、約24,000あるため、手動でこれを行うのはやや面倒です。

基本的に、私は既存のアルゴリズム(できれば既存の参照実装を使用)を探して、文字列の任意のリストを取得し、生成に使用できる正規表現のいくつかの最小(最小の合理的な定義)にまたがるセットを推測しようとしますそれら(つまり、その文法によって生成された言語からの文字列の有限集合から正規文法を推測します)。

貪欲で最長の一般的な部分文字列の削除を繰り返すことを検討しましたが、完全一致以外は折りたたまれないため、これまでのところ、たとえば、の特定の位置で変化する数値文字列の一般的なパターンは検出されません。文法。

一般的な部分文字列の除去から外れないものをブルートフォースすることは可能ですが、おそらく計算上実行不可能です。(さらに、私はそれについて考えました、そしてあなたが最終的な文法をより圧縮されないようにすることになる貪欲な部分文字列の一致をするかもしれないので、部分文字列の除去に関する「フェーズ順序付け」および/または「ローカル最小」問題があるかもしれません/最初は最良の削減であるように見えますが、最小限です)。

4

2 に答える 2

23

はい、これは存在することがわかりました。必要なのは、 DFAラーニングアルゴリズムとして学術的に知られているものであり、その例には次のものが含まれます。

  • アングルインのL*
  • L *(列にカウンター例を追加)
  • カーンズ/ヴァジラニ
  • リベスト/シャピア
  • NL *
  • 通常の正負の推論(RPNI)
  • DeLeTe2
  • Biermann&Feldmanのアルゴリズム
  • Biermann&Feldmanのアルゴリズム(SAT解決を使用)

上記のソースは、C++のオープンソースオートマトン学習アルゴリズムフレームワークであるlibalfです。これらのアルゴリズムの少なくともいくつかの説明は、とりわけこの教科書にあります。MATLABのgitoolboxには、文法的推論アルゴリズム(DFA学習を含む)の実装もあります。

この質問は以前に出てきて、過去に十分に答えられていなかったので、私はこれらのアルゴリズムを評価している最中であり、その分野の専門知識を持つ誰かが最初にしない限り、それらがどれほど有用であるかについてのより多くの情報を更新します(望ましい)。

注:私は今のところ自分の答えを受け入れていますが、誰かがそれを提供できれば、より良い答えを喜んで受け入れます。

さらに注意:一般的なアルゴリズムを使用することは、私が使用しているデータに対して少しやり過ぎであることが判明したため、カスタムコードを使用するルートを採用することにしました。他の誰かがそれを必要とする場合に備えて、私はこの答えをここに残します、そして私がこれらを評価することがあれば更新します。

于 2013-03-20T09:31:25.143 に答える
0

私が提案できる唯一のことは、Nltk(Python用のNatural Language Toolkit)を少し試して、少なくとも繰り返しパターンを認識できるかどうかを確認することです。

あなたが調べるかもしれないもう一つのことはMALLET(統計的自然言語処理、文書分類、クラスタリング、トピックモデリング、情報抽出などのためのJavaベースのパッケージ)です。

PerlにはLinkParserと呼ばれるものがありますが、実際の文法の表現を提供する必要があるようです(一方、さまざまなモデルのセットが多数付属しているため、サンプルの並べ替えに役立つ可能性があります)。

Gateを使用すると、コーパス内のレコードのサブセットから例を作成し、場合によってはそれらから文法をリバースエンジニアリングすることができます。

最後に、テキスト固有のパッケージのCRANリポジトリを確認してください。

于 2013-03-20T13:41:30.750 に答える