のような特殊文字で文が終わるテキスト ファイルを解析するための正規表現を探していますが、George .
W. Bush、Mr. Hopkins Mrs. Violet などの単語は無視します。!
?
試してみ(?!Mr|Mrs|[A-Za-z]\.\s)\S.+?[.!?](?=\s+|$)
ましたが、これは機能していないようです。
のような特殊文字で文が終わるテキスト ファイルを解析するための正規表現を探していますが、George .
W. Bush、Mr. Hopkins Mrs. Violet などの単語は無視します。!
?
試してみ(?!Mr|Mrs|[A-Za-z]\.\s)\S.+?[.!?](?=\s+|$)
ましたが、これは機能していないようです。
英語は明らかに非正規言語です。正規表現だけでは不十分だと思います。おそらく、完全なトークナイザーに加えて、ある文がどこで終わり、次の文が始まるかを検出するために、ある種の機械学習、おそらくマルコフ モデルが必要になるでしょう。それでも、それはヒューリスティックにすぎません。人間の言語の使用は雑であるため、正確な解決策は決して不可能かもしれません。
私は正規表現の専門家ではありませんが、この正規表現が文間の区切りを識別するのにうまく機能することがわかりました。
(?<!\b\p{Upper}\w{0,4})(?=[.?!]\s*\p{Upper})[.?!]\s*
タイトルは大文字であるため、大文字で始まる単語がある場所を除いて、文の句読点とそれに続く大文字を検索します。
また、これは Java 正規表現であるため、\p{Upper}
機能しない可能性があることに注意してください。
また、タイトルの長さ 4 は任意であり、正規表現ではルックバックに固定長が必要であり、4 文字を超えるタイトルの省略形は考えられませんでした。
正規表現を学んでいる人のために、分解してみましょう。
# Don't match where we have a short word beginning with a capital (for titles)
(?<!\b\p{Upper}\w{0,4})
(?=[.?!]\s*\p{Upper}) # Only match when followed by a captial. (for abbreviations)
[.?!] #match the punctuation
\s* #also match white space, so no trimming is required (optional)
そして、これは、この正規表現をロープに通す無意味なテストの段落です。
This is a sentence. I really want to win, etc. and win more. This is pretty neat. I want to thank Mr. Shea for his work. Mr. Hugo helped as well. M. Thénardier is thankful as well. The wonderful Mr. Albert Einstien PhD. is a cool dude as well.
編集: 私はこれについて考えてきましたが、この正規表現が機能しないケースを 1 つ見つけました。次のフレーズを考えてみましょう。
Joey loved talking to Max. This was because Max is his best friend.
この例でMax. This
は、 を名前とタイトルとして取り上げています。これは短い名前でのみ機能します (5 文字\w{0,4}
未満4
の . 私の方法は完璧ではないと思いますが、ほとんどの状況には十分に近いと思います。