Python-テキストを文に分割するための正規表現(文トークン化)



Python Regex Splitting Text Into Sentences



解決:

(?これを試して。文字列をこれに分割します。デモを確認することもできます。

http://regex101.com/r/nG1gU7/27




さて、センテンストークンは、正規表現、nltk、Core NLP、spaCyを使用して、少し詳しく調べました。あなたはあなた自身を書くことになり、それはアプリケーションに依存します。このようなものはトリッキーで価値があり、人々はトークナイザーコードを渡すだけではありません。 (最終的に、トークン化は決定論的な手順ではなく、確率論的であり、コーパスまたはドメインにも大きく依存します。たとえば、法律/財務文書、ソーシャルメディアの投稿、Yelpのレビュー、生物医学の論文などです...)

一般に、単一のGreatWhiteの間違いのない正規表現に依存することはできません。 、いくつかの正規表現(正と負の両方)を使用する関数を作成する必要があります。また、略語の辞書、およびそれを知っているいくつかの基本的な言語解析。 「I」、「USA」、「FCC」、「TARP」は英語で大文字になっています。



これが非常に簡単に複雑になる可能性があることを説明するために、決定論的トークナイザーの機能仕様を書いてみましょう。 ただ 単一のピリオドまたは複数のピリオド( '。' / '...')が文の終わりを示すかどうかを決定する 、 または、他の何か:

関数isEndOfSentence(leftContext、rightContext)

  1. 数値または通貨内の小数の場合はFalseを返します。例: 1.23、$ 1.23、「それは私の$ .02です」 1.2.3のようなセクション参照、2014年7月9日のようなヨーロッパの日付形式、192.168.1.1のようなIPアドレス、MACアドレス...も検討してください。
  2. 既知の略語については、Falseを返します(個々の文字にトークン化しないでください)。 '我ら。在庫が減少しています ';これには、既知の略語の辞書が必要です。 A.B.C.のような未知の略語を検出するコードを追加しない限り、その辞書の外にあるものはすべて間違っています。それらをリストに追加します。
  3. 文末の省略記号「...」は終端ですが、文の途中ではそうではありません。これは思ったほど簡単ではありません。左側のコンテキストと右側のコンテキストを確認する必要があります。具体的には、RHSは大文字で表記され、「I」や略語などの大文字の単語を再度検討する必要があります。これは、あいまいさを証明する例です。 彼女は私にとどまるように頼んだ...私は1時間後に去った。 (それは一文か二文でしたか?決定することは不可能です)
  4. また、文を終わらせない句読点のその他の使用を検出して拒否するために、いくつかのパターンを作成することもできます。絵文字:-)、 ASCII アート、間隔を空けた楕円。 。 。と他のもの、特に。ツイッター。 (その適応性を高めることはさらに困難です)。 @midnightがTwitterユーザーであるか、Comedy Centralでの番組であるか、テキストの速記であるか、または単に不要/ジャンク/タイプミスの句読点であるかをどのように判断しますか?真剣に重要です。
  5. これらの否定的なケースをすべて処理した後、空白が続く孤立したピリオドは文の終わりになる可能性が高いと任意に言うことができます。 (最終的に、本当に余分な精度を購入したい場合は、重みを使用する独自の確率的文トークンを作成し、特定のコーパス(たとえば、法的テキスト、放送メディア、StackOverflow、Twitter、フォーラムのコメントなど)でトレーニングすることになります。 )次に、エグザンプラとトレーニングエラーを手動で確認する必要があります。マニングとジュラフスキーの本またはCourseraコース[a]を参照してください。最終的には、支払う準備ができているのと同じくらい正確になります。
  6. 上記のすべては、英語/略語、米国の番号/時刻/日付の形式に明確に固有です。国や言語に依存しないようにしたい場合、それはより大きな提案です。コーパス、ネイティブスピーカーの人々がすべてにラベルを付けてQAを行う必要があります。
  7. 上記のすべてはまだASCIIのみであり、実際には96文字しか話せません。入力がUnicodeであることを許可すると、事態はさらに困難になります(そして、トレーニングセットは必然的にはるかに大きくなるか、はるかにまばらになる必要があります)

単純な(決定論的な)場合、関数isEndOfSentence(leftContext、rightContext)はブール値を返しますが、より一般的な意味では、確率的です。つまり、浮動小数点数0.0〜1.0を返します(その特定の「。」が文の終わりであるという信頼水準)。



参考資料:[a] Courseraビデオ: '基本的なテキスト処理2-5-文のセグメンテーション-スタンフォードNLP-ダンジュラフスキー教授とクリスマニング' [更新:以前はYouTubeにあった非公式バージョンが削除されました]


ドットやまたはではなく、スペースに従って入力を分割してみてください?、これが好きなら、ドットまたは?最終結果には印刷されません。

>>> import re >>> s = '' 'Mr。スミスはcheapsite.comを150万ドルで購入しました。つまり、彼はそれに対して多額の支払いをしました。彼は気にしましたか?アダムジョーンズジュニアは彼がしなかったと思います。いずれにせよ、これは真実ではありません...まあ、.9の確率でそうではありません。」>>> m = re.split(r '(?>> for i in m:.. .print i ... Smith氏はcheapsite.comを150万ドルで購入しました。つまり、多額の支払いをしました。気になりましたか?Adam Jones Jr.は、そうしなかったと思います。いずれにせよ、これは真実ではありません。 ..まあ、.9の確率でそうではありません。