2016-08-25 10 views
3

RegexpTokenizerを使用してテキストをトークン処理しようとしています。NLTK - nltk.tokenize.RegexpTokenizer - regexが正常に動作しません。

コード:

from nltk.tokenize import RegexpTokenizer 
#from nltk.tokenize import word_tokenize 

line = "U.S.A Count U.S.A. Sec.of U.S. Name:Dr.John Doe J.Doe 1.11 1,000 10--20 10-20" 
pattern = '[\d|\.|\,]+|[A-Z][\.|A-Z]+\b[\.]*|[\w]+|\S' 
tokenizer = RegexpTokenizer(pattern) 

print tokenizer.tokenize(line) 
#print word_tokenize(line) 

出力: ' '

[ 'U'、 'S'、 'A'、 'カウント'、'。' 「U」、「S」、「。」、「A」、「。」、「Sec」、「。」、「of」、「U」、「。」、「S」。 「Doe」、「Doe」、「Doe」、「1.11」、「1,000」、「10」、「Doe」、「Doe」、「Doe」、 ' - '、 ' - '、 '20'、 '10'、 ' - '、 '20']

予想される出力: ''

[ 'USA'、 'カウント'、 'USA'、 '秒'、 'の'、 '米国'、 '名前'、 ':' 「Doe」、「Doe」、「Doe」、「1.11」、「1,000」、「10」、「 - 」、「 - 」、「20」、 '10 '、' - '、' 20 ']

tokenizerが私の予想されるトークン「spearting」をなぜ「USA」、「US」ですか? この問題を解決するにはどうすればよいですか?

私の正規表現:https://regex101.com/r/dS1jW9/1

答えて

6

を望んでいた出力が得られます\bはバックスペース文字だったので、生の文字列リテラルを使用する必要があります。また、文字クラスには出力を混乱させるリテラルパイプがあります。

これは期待通りに動作します:文字クラスに単一\wを置くことは無意味であることを

>>> pattern = r'[\d.,]+|[A-Z][.A-Z]+\b\.*|\w+|\S' 
>>> tokenizer = RegexpTokenizer(pattern) 
>>> print(tokenizer.tokenize(line)) 

['U.S.A', 'Count', 'U.S.A.', 'Sec', '.', 'of', 'U.S.', 'Name', ':', 'Dr', '.', 'John', 'Doe', 'J.', 'Doe', '1.11', '1,000', '10', '-', '-', '20', '10', '-', '20'] 

注意を。また、文字クラスの文字以外の文字(ドットのような)をエスケープする必要はありません。文字クラスのほとんどはリテラル文字として扱われます(唯一^]-\に特に注意が必要です)。

0

あなたの正規表現が続いて

pattern = '[USA\.]{4,}|[\w]+' 
tokenizer = RegexpTokenizer(pattern) 
print (''+str(tokenizer.tokenize(line))) 

pattern = '[USA\.]{4,}|[\w]+|[\S]' 

を国防省場合あなたはポイントがあることである

['U.S.A', 'Count', 'U.S.A.', 'Sec', '.', 'of', 'U.S.', 'Name', ':', 'Dr', '.', 'John', 'Doe', 'J', '.', 'Doe', '1', '.', '11', '1', ',', '000', '10', '-', '-', '20', '10', '-', '20'] 
+0

'[[USA \。] {4、} | [\ w] + ''も '............'と一致します。単一の '\ w'を文字クラスに入れ、文字クラスの中にドットをエスケープする必要はありません。 –

+0

合意 - しかし、テストデータが与えられた(と私はより良い解決策を考えるにはあまりにも怠惰でした)これは私が与えたものです:) –

関連する問題