7

It seems hard to detect a sentence boundary in a text. Quotation marks like .!? may be used to delimite sentences but not so accurate as there may be ambiguous words and quotations such as U.S.A or Prof. or Dr. I am studying Tperlregex library and Regular Expression Cookbook by Jan Goyvaerts but I do not know how to write the expression that detects sentence?

What may be comparatively accurate expression using Tperlregex in delphi?

Thanks

4

3 に答える 3

6

まず、おそらく「文」とは何かについて独自の定義に到達し、次にその定義を実装する必要があります。たとえば、次のようにします。

He said: "It's OK!"

一文か二文か?一般的な答えは関係ありません。1 つまたは 2 つの文として解釈するかどうかを決定し、それに応じて続行します

第二に、これに正規表現を使用するとは思いません。代わりに、各文字をスキャンしてシーケンスを検出しようとしました。ピリオドだけでは文を区切るのに十分ではないかもしれませんが、ピリオドの後に空白またはキャリッジ リターン (または文字列の末尾) が続くと、おそらく十分です。これにより、すぐに USA (空白が続かないピリオド) を取り除くことができます。

Prof. や Dr. などの一般的な略語については、辞書を作成することをお勧めします。各言語には独自の一般的な略語のセットがあるため、ユーザーが編集できるようにすることをお勧めします。

各言語には独自の句読点規則のセットもあり、これは句読点文字の解釈方法に影響を与える可能性があります。たとえば、英語では括弧内にピリオドを入れる傾向がありますが (このように)、ポーランド語はその反対を行います (このように)。同じ違いが二重引用符、単一引用符にも当てはまります (一部の言語ではそれらをまったく使用せず、アポストロフィなどと区別できない場合もあります)。ルールは、少なくとも部分的には言語固有でなければならない場合があります。

最終的には、文を区切る人間の方法に近づけることができますが、分析がうまくいかない場合が常にあります。たとえば、「Prof.」を認識する辞書があるとします。略語として、あなたは何をしようとしていますか

Most people called him Professor Jones, but to me he was simply The Prof.

大文字で始まる別の文があっても、それは文の終わりを知るのに役立ちません。

Most people called him Professor Jones, but to me he was simply Prof. Bill.
于 2011-04-20T16:17:19.913 に答える
1

ここで私のチュートリアルを確認してくださいhttp://code.google.com/p/graph-expression/wiki/SentenceSplitting。この具体的な例は、正規表現といくつかの命令型コードに簡単に書き直すことができます。

于 2011-04-21T06:17:39.243 に答える
0

事前トレーニング済みのモデルで NLP プロセッサを使用することをお勧めします。EnglishSD.nbinは、OpenNLP で利用できるそのようなモデルの 1 つであり、SharpNLP を使用して Visual Studio で使用できます。

この方法を使用する利点は数多くあります。たとえば、入力を考えてみましょう

ジェシカ先生は素晴らしい女性です。彼女はアメリカ出身で、Jacob Jr.氏と結婚しています。

たとえば、正規表現分割を使用している場合

 string[] sentences = Regex.Split(text, @"(?<=['""A-Za-z0-9][\.\!\?])\s+(?=[A-Z])");

次に、上記の入力は次のように分割されます

教授

ジェシカは素晴らしい女性です。

彼女はUの出身です。

S.

A.

彼女はMr.と結婚しています。

ジェイコブ Jr.

ただし、望ましい出力は

ジェシカ先生は素晴らしい女性です。

彼女はアメリカ出身で、Jacob Jr.氏と結婚しています。

この種の論理的な文の分割は、OpenNLP プロジェクトのトレーニング済みモデルを使用してのみ実現できます。方法はこれと同じくらい簡単です。

private string mModelPath = @"C:\Users\ATS\Documents\Visual Studio 2012\Projects\Google_page_speed_json\Google_page_speed_json\bin\Release\";
private OpenNLP.Tools.SentenceDetect.MaximumEntropySentenceDetector mSentenceDetector;
private string[] SplitSentences(string paragraph)
    {
        if (mSentenceDetector == null)
        {
            mSentenceDetector = new OpenNLP.Tools.SentenceDetect.EnglishMaximumEntropySentenceDetector(mModelPath + "EnglishSD.nbin");
        }

        return mSentenceDetector.SentenceDetect(paragraph);
    }

mModelPath は、nbin ファイルを含むディレクトリのパスです。

mSentenceDetector は、OpenNLP dll から派生しています。

次の方法で目的の出力を得ることができます

string[] sentences = SplitSentences(text);

SharpNLP を Visual Studio のアプリケーションと統合して NLP ツールを利用するために書いたこの記事を読んでください。

于 2013-10-19T08:23:27.777 に答える