3

それで、私はスタンフォードパーサーを見つけて現在使用しています、そしてそれは文を分割するために素晴らしい働きをします。私たちの文章のほとんどはAPからのものなので、そのタスクには非常にうまく機能します。

ここに問題があります:

  • たくさんのメモリを消費します(600Mたくさん)
  • 後で使用するために多くのエッジケースを作成する必要がある場合、テキストの本文のフォーマットが実際に台無しになります。(ドキュメントプリプロセッサAPI呼び出しでは、ascii / utf8引用符を指定できません。すぐにラテックススタイルになり、収縮は(明らかに)異なる単語に分割され、偽のスペースは異なる場所に配置されます)

この目的のために、私は実際に行う必要がないことを補うために、すでに複数のパッチを作成しました。

基本的には、最初に文を分割する問題と同じくらい、使用するのが邪魔になるところです。

私の他のオプションは何ですか?他に役立つ可能性のあるNLPタイプのフレームワークはありますか?

私の元々の問題は、高い確率で文のエッジを検出できることです。

4

4 に答える 4

5

Stanford Tokenizer / Parserを使い続けたい場合は、トークナイザーのドキュメントページを参照してください

文を分割したいだけの場合は、パーサーを適切に呼び出す必要はありません。そのため、DocumentPreprocessorを直接使用することで、少量のメモリ(1〜2メガバイト)を節約できるはずです。

使用可能なトークナイザーのカスタマイズは限られていますが、引用符の処理を変更できます。次のいずれかを試してみてください。

unicodeQuotes=false,latexQuotes=false,asciiQuotes=false
unicodeQuotes=true

1つ目は、いかなる種類の引用符マッピングもないことを意味し、2つ目は、単一または二重のASCII引用符(存在する場合)を、その能力を最大限に発揮して左右の引用符に変更します。

また、トークナイザーはPenn Treebankの規則に一致するようにさまざまな方法で単語を分割しますが、返されたトークンから元のテキストを正確に作成できるはずです(CoreLabelの他のさまざまなフィールドを参照)。そうでなければ、それはバグです。

于 2011-09-21T23:41:14.010 に答える
1

利用可能なセンテンススプリッターはたくさんあります。パフォーマンスは特定のアプリケーションによって異なります。

PerlPythonのバージョンを始めるのはとても簡単です。私が過去に厄介だと思ったスタンフォードパーサーバージョン。私はドメイン固有のスプリッター(Genia)を使用することになりました。また、正規表現ベースのクリーンアップツールを実行して、ひどく分割された文を探し、それらを再アセンブルしました。

于 2011-09-21T22:05:40.720 に答える
1

スタンフォードNLPを使用し、文字を奇妙な文字(括弧やアポストロフィなど)に置き換えることなく、テキストから文を分割する1つの方法があります。

PTBTokenizer ptbt = new PTBTokenizer(
                    new StringReader(text), new CoreLabelTokenFactory(), "ptb3Escaping=false");
List<List<CoreLabel>> sents = (new WordToSentenceProcessor()).process(ptbt.tokenize());
Vector<String> sentences = new Vector<String>();
for (List<CoreLabel> sent : sents) {
    StringBuilder sb = new StringBuilder("");
    for (CoreLabel w : sent) sb.append(w + " ");
        sentences.add(sb.toString());
    }
}               

DocumentPreprocessorを使用する標準的な方法では、元のテキストがねじ込まれます。

于 2013-11-29T23:15:23.173 に答える
0

NLTK(特にnltk.tokenizeパッケージ)を使用できます。

import nltk
sentence_detector = nltk.data.load('tokenizers/punkt/english.pickle')
text = "This is a test. Let's try this sentence boundary detector."
text_output = sentence_detector.tokenize(text)
print('text_output: {0}'.format(text_output))

出力:

text_output: ['This is a test.', "Let's try this sentence boundary detector."]
于 2016-07-25T17:03:59.877 に答える