17

私はプログラミングが初めてです。これが些細なことのように思われる場合は申し訳ありません: 正規表現を使用して個々の文に分割しようとしているテキストがあります。この.split方法では、ドットの後に大文字が続くように検索します

"\. A-Z"

ただし、このルールを次のように改良する必要があります。.(ドット)の前にAbsまたはを付けることはできませんS。また、後に大文字 ( A-Z) が続く場合でも、月名の場合は一致しませんJanuary | February | March

前半を実装してみましたが、これでもうまくいきませんでした。私のコードは次のとおりです。

"( (?<!Abs)\. A-Z) | (?<!S)\. A-Z) ) "
4

5 に答える 5

21

まず、スペースを に置き換える\s+\s、実際にスペースが 1 つだけの場合 (英語のテキストではダブル スペースがよく見られます) を使用することをお勧めします。

次に、大文字に一致させるには を使用する必要がありますが[A-Z]、機能しA-Zません (ただし、... 以外の大文字が存在する可能性があることに注意してA-Zください)。

さらに、これが機能しない理由もわかっていると思います。またはが前\. [A-Z]に付いていない場合、正規表現エンジンは一致を試みます。問題は、 が前にある場合、が前にないため、最初のパターンが一致するということです。が前に付いている場合は、が前に付いていないため、2 番目のパターン バージョンが一致します。どちらの方法でも、これらのパターンのいずれかが一致し、相互に排他的になります。AbsSSAbsAbsSAbsS

質問の最初の部分のパターンは次のようになります

(?<!Abs)(?<!S)(\. [A-Z])

また

(?<!Abs)(?<!S)(\.\s+[A-Z])

(私の提案で)

これは、回避する必要があるためです。それがなけれ|ば、式はAbsが先行せず、S が先行しないと言うようになりました。両方が true の場合、パターン マッチャーは引き続き文字列をスキャンし、一致するものを見つけます。

月の名前を除外するために、次の正規表現を思い付きました。

(?<!Abs)(?<!S)(\.\s+)(?!January|February|March)[A-Z]

同じ議論が否定的な先読みパターンにも当てはまります。

于 2012-10-02T11:16:14.470 に答える
1

@root が推奨する nltk または同様のツールを使用します。

正規表現の質問に答えるには:

import re
import sys

print re.split(r"(?<!Abs)(?<!S)\.\s+(?!January|February|March)(?=[A-Z])",
               sys.stdin.read())

入力

First. Second. January. Third. Abs. Forth. S. Fifth.
S. Sixth. ABs. Eighth

出力

['First', 'Second. January', 'Third', 'Abs. Forth', 'S. Fifth',
 'S. Sixth', 'ABs', 'Eighth']
于 2012-10-02T11:41:00.163 に答える
1

nltk punkt tokenizerを使用します。おそらく正規表現を使用するよりも堅牢です。

>>> import nltk.data
>>> text = """
... Punkt knows that the periods in Mr. Smith and Johann S. Bach
... do not mark sentence boundaries.  And sometimes sentences
... can start with non-capitalized words.  i is a good variable
... name.
... """
>>> sent_detector = nltk.data.load('tokenizers/punkt/english.pickle')
>>> print '\n-----\n'.join(sent_detector.tokenize(text.strip()))
Punkt knows that the periods in Mr. Smith and Johann S. Bach
do not mark sentence boundaries.
-----
And sometimes sentences
can start with non-capitalized words.
-----
i is a good variable
name.
于 2012-10-02T11:13:47.813 に答える