1

私は最初の重要な正規表現 (Python で使用するため) を構築しようとしていますが、苦労しています。

言語 X (英語ではない) の単語が最小限の「構造」のシーケンスであると仮定しましょう。各「構造」は次のようになります。

An independent vowel (basically one letter of the alphabet)
A consonant (one letter of the alphabet)
A consonant followed by a right-attaching vowel
A left-attaching vowel followed by a consonant
(Certain left-attaching vowels) followed by a consonant followed by (certain right-attaching vowels)

たとえば、この 3 文字の単語:

<a consonant><a left-attaching vowel><an independent vowel>

は有効な単語ではなく、正規表現と一致するべきではありません。左側に付く母音の右側に子音がないためです。

私はすべての Unicode 範囲を知っています - 子音、独立母音、左接母音などの Unicode 範囲。

これが私がこれまでに持っているものです:

WordPattern = (
ur'('
ur'[\u0985-\u0994]|'
ur'[\u0995-\u09B9]|'
ur'[\u0995-\u09B9(\u09BE|[\u09C0-\u09C4])]|'
ur'[(\u09BF|\u09C7|\u09C8)\u0995-\u09B9]|'
ur'[(\u09BF|\u09C7|\u09C8)\u0995-\u09B9(\u09BE|[\u09C0-\u09C4])]'
ur')+'
)

動いていない。それを機能させることとは別に、私には3つの特定の問題があります。

  • 正規表現を複数の行に分割する必要があります。そうしないと、コードが見栄えが悪くなります。どうすればいいですか?
  • コードの読みやすさと Unicode 範囲の複数回の入力を防ぐために、Unicode 範囲に「名前を付ける」ために何らかの文字列置換/テンプレートを使用したいと思います。
  • (これは非常に難しいようです) 許容される最小限の「構造」のリストは、後で拡張する必要があります。リスト内のすべての許容される構造に対して機能するように、正規表現内に一種の「ループ」メカニズムを設定する方法はありますか?

どんな助けでも大歓迎です。これは初心者には非常に複雑に思えます。

4

2 に答える 2

4

自明でない形態を持つ言語の形態素解析に適したツールは、「有限状態変換器」です。追跡して使用できる堅牢な実装があります (Xerox Parc によるもの)。Python バインディングを持つものがあります (外部ライブラリとして使用するため)。ググってください。

FST は、(純粋な) 正規表現のような有限状態オートマトンに基づいていますが、決して簡単な代替ではありません。これは複雑な機構なので、目的が単純な場合 (ハイフネーションのための音節化など) は、より単純なものを探した方がよいでしょう。たとえば、ハイフネーションを「学習」する機械学習アルゴリズムがあります。本当に形態素解析に興味があるなら、FST を調べる努力をしなければなりません

ここで、アルゴリズムについて、本当に些細な実装のみが必要な場合に備えて: 母音または子音は独立している可能性があるため、ルールがあいまいです: 「ab」を「ab」として解析できます。このようなあいまいさは、正規表現のアプローチがおそらく機能しないことを意味しますが、最初に長い正規表現を配置すると、より良い結果が得られる可能性があるため、両方が適用される場合、短い正規表現よりも優先して使用されます。しかし、実際にはパーサーを (手動で、またはモジュールを使用して) 作成し、さまざまなことを段階的に試す必要があります。想像していたものとは逆です。さまざまな正規表現を使用するループを設定し、文字列を段階的に「消費」します。

しかし、あなたが説明しているのは本質的に音節化であるように私には思えます。そして、音節化のほぼ普遍的な規則は次のとおりです。音節は、コア母音と、言語の規則が許す限り多くの先行する (「オンセット」) 子音、および次の音節に属することができない後続の子音で構成されます。このルールは「最大化開始」と呼ばれ、音節を後方 (単語の末尾から) に解析する方が簡単であるという結果があります。やってみて。

PS。おそらくこれはご存じでしょうが、スクリプトの 2 行目に次のコードを記述すれば、正規表現にベンガル語を埋め込むことができます。

# -*- coding: utf-8 -*-
于 2012-04-16T13:55:17.127 に答える
0
  • 正規表現を複数の行に分割する必要があります。そうしないと、コードが見栄えが悪くなります。どうすればいいですか?

re.VERBOSE正規表現をコンパイルするときにフラグを使用します。

pattern = re.compile(r"""(
                            [\u0985-\u0994]  # comment to explain what this is
                          | [\u0995-\u09B9]
                          # etc.
                         )
                      """, re.VERBOSE)
  • 文字列置換/何らかのテンプレートを使用して Unicode 範囲に「名前を付ける」ことを希望します

通常の Python 文字列から RE を構築できます。

>>> subpatterns = {"vowel": "[aeiou]", "consonant": "[^aeiou]"}
>>> "{consonant}{vowel}+{consonant}*".format(**subpatterns)
'[^aeiou][aeiou]+[^aeiou]*'
  • 許容される最小限の「構造」のリストは、後で拡張する必要があります。リスト内のすべての許容される構造に対して機能するように、正規表現内に一種の「ループ」メカニズムを設定する方法はありますか?

あなたの言いたいことが理解できるかどうかはわかりませんが... (コンパイルされていない) RE のリストがあるとしますpatterns

re.compile("(%s)" % "|".join(patterns))

この方法で正規表現を作成するときは特殊文字に注意しre.escape、必要に応じて使用してください。

于 2012-04-16T12:40:32.060 に答える