0

不明なテキストを特定の長さにトリミングするためのソリューションを探しています。完全な文のみを保持します。

だから、このようなテキスト

"Were you born 1. 3. 1987 in Prague? Štěpán Jr. lives there for 3 years now! "

に変換する必要があります

"Were you born 1. 3. 1987 in Prague? "

文字数制限は 50、40 (および --find-next-sentence-ending では 20)。

私は多くのSOの質問を読みました-答えのほとんどはバリエーションでした

substr($text, 0, strrpos('.', $text) + 1);

しかし、上記の文などでは明らかに失敗します。スタンフォード テキスト パーサーまたは OpenNLP の使用を提案する人もいます。それらは本当にクールですが、通常のアプリケーションでは使用できません。テキストをトリミングするためだけに、Ruby/PHP サーバーに Java をインストールすることはありません。したがって、言語にとらわれず、表示される典型的なケースを処理できる、80/20 のソリューションを探しています。

これよりも問題のある文は考えられませんでした(次の文の先頭に日付、非ドットの文末、非ASCII文字が含まれ、「制限」文の途中に非終了のドットが含まれています)。

また、フォークして遊ぶための GIST (https://gist.github.com/4051035) も作成しました。フォークすると、ユーザーはこの問題のさまざまな解決策にクリックスルーできることが保証されるので、それを使用してください ;)この質問をコミュニティ ウィキにしますが、質問に対しては機能しないようです - 回答に対してのみです。したがって、コメントに提案/関連するSOの質問を追加してください。ありがとう。

4

2 に答える 2

1

80% の精度を得るのに十分な場合は、単純なルールを適用できます。

  • 各 '?' と '!' 文の終わりをマークする
  • 次の単語が大文字で始まるが、すべてが大文字ではない場合にドット チェックを見つけた場合 (これは 80/20 ルール専用であることを思い出してください)

もっと良いものが必要な場合は、残念ながら nlp ライブラリが必要です。php/ruby ホスティングを使用している場合は、NLTKを使用できるはずです。これは Python で書かれており、優れたサポートを提供しています。

于 2012-11-17T14:23:55.720 に答える
0

これを解決する私の大まかなアイデアは、最後の文の区切り記号 (つまり、ドットスペース) をチェックし、その位置の周りにドットスペースで区切られた数字または既知のパターンがあるかどうかを確認し、ある場合は臆病に前の文を選択することです。次の数値ドットスペース以外の位置を計算し、それがソフトリミット ($limit+10 など) にある場合は、現在の文を選択します。

于 2012-11-10T13:39:32.770 に答える