3

テキストファイル(電子書籍)を処理する必要があります。1行に1文になるように処理したいのですが(「改行区切りファイル」ですね)。UNIXユーティリティのsedを使用してこのタスクを実行するにはどうすればよいですか?「単語の境界」の記号のような「文の境界」の記号がありますか(GNUバージョンにはそれがあると思います)。文はピリオド、省略記号、質問、または感嘆符で終わる可能性があることに注意してください。最後の2つを組み合わせて使用​​します(たとえば、?、!、!?、!!!!!はすべて有効な「文のターミネータ」です)。入力ファイルは、一部の文に削除する必要のある改行が含まれるようにフォーマットされています。

私は次のようなスクリプトについて考えましたs/...|. |[!?]+ |/\n/g(読みやすくするためにエスケープされていません)。ただし、文の中から改行は削除されません。

C#ではどうですか?sedのように正規表現を使用すると、非常に高速になりますか?(私はそうは思わない)。他にもっと速い方法はありますか?

どちらの方法(sedまたはC#)でも問題ありません。ありがとうございました。

4

5 に答える 5

3

正規表現は、私が長い間使用していた良いオプションです。

私にとってうまくいった非常に良い正規表現は

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

ただし、正規表現は効率的ではありません。また、ロジックは理想的なケースでは機能しますが、本番環境ではうまく機能しません。

たとえば、私のテキストが

アメリカは素晴らしい国です。ほとんどの人は、そこに住むことに幸せを感じています。

正規表現メソッドは、各期間で分割することにより、5 つの文として分類します。しかし、論理的には、2 つの文に分割する必要があることはわかっています。

これが私が機械学習技術を探すようになった理由であり、ついに SharpNLP は私にとってかなりうまく機能しました.

 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);
    }

この例では、EnglishSD.nbin を使用した SharpNLP を使用しました。これは、文検出用の事前トレーニング済みモデルです。

このメソッドに同じ入力を適用すると、テキストは 2 つの論理文に完全に分割されます。

SharpNLP プロジェクトを使用して、POSTag、Chuck などをトークン化することもできます。

SharpNLP を C# アプリケーションに段階的に統合するには、私が書いた詳細な記事を読んでください。コード スニペットとの統合について説明します。

ありがとう

于 2013-10-19T08:04:33.710 に答える
1

文の分割は、機械学習アルゴリズムが開発された重要な問題です。[.\?!]+しかし、 と 大文字の間の空白で分割する[A-Z]ことは、適切なヒューリスティックかもしれません。最初に で改行を削除してtrから、RE を適用します。

tr '\r\n' ' ' | sed 's/\([.?!]\)\s\s*\([A-Z]\)/\1\n\2/g'

出力は 1 行に 1 文である必要があります。出力を検査し、エラーが見つかった場合は RE を修正します。(たとえば、mr. Ed誤って処理される可能性があります。おそらく、そのような略語のリストをコンパイルします。)

C# とC# のどちらsedが速いかは、実験的にしか判断できません。

于 2011-04-11T11:50:56.910 に答える
0

私のチュートリアルhttp://code.google.com/p/graph-expression/wiki/SentenceSplittingを確認でき ます。Tji の単純なヒューリスティックは非常にうまく機能します。

于 2011-04-11T22:10:55.780 に答える
0

あなたが興味を持っているタスクは、「文の分割」と呼ばれることがよくあります。larsmans が言ったように、これは重要な問題ですが、少なくとも英語の場合、ヒューリスティックなアプローチはしばしばかなりうまく機能します。

あなたは主に英語に興味があるようです。そのため、既に提示されている正規表現ヒューリスティックは、ニーズに十分に対応できる可能性があります。もう少し正確なソリューションが必要な場合は (多少複雑になりますが)、オープンソースの NLP フレームワークである LingPipe の使用を検討してください。私は LingPipe でかなりの幸運に恵まれました。数回使用しました。

文の分割に関する詳細なチュートリアルについては、http://alias-i.com/lingpipe/demos/tutorial/sentences/read-me.htmlを参照してください。

于 2011-04-18T20:09:06.223 に答える
0

次のようなものを使用して、文を抽出できます。

var sentences = Regex.Matches(input, @"[\w ,]+[\.!?]+")
foreach (Match match in sentences)
{
  Console.WriteLine(match.Value);
}

これは、単語、スペース、コンマを含み、ピリオド、感嘆符、および疑問符 (任意の数) で終わる文と一致する必要があります。

于 2011-04-11T11:41:40.380 に答える