2016-06-30 10 views
5

私はCountVectorizerを使用していて、ハイフネーションされた単語を別のトークンに分けたくありません。私はtoken_pattern引数に異なる前置詞パターンを渡そうとしましたが、目的の結果を得ることができませんでした。scikit-learn:トークン化中にハイフネーションされた単語を分離しないでください。

pattern = r''' (?x)   # set flag to allow verbose regexps 
([A-Z]\.)+   # abbreviations (e.g. U.S.A.) 
| \w+(-\w+)*  # words with optional internal hyphens 
| \$?\d+(\.\d+)?%? # currency & percentages 
| \.\.\.   # ellipses ''' 

text = 'I hate traffic-ridden streets.' 
vectorizer = CountVectorizer(stop_words='english',token_pattern=pattern) 
analyze = vectorizer.build_analyzer() 
analyze(text) 

は私も以前の質問で提案されているようにnltkregexp_tokenizeを使用しようとしましたが、それは行動が同様に変更されているように見えるのです。

は、ここで私がしようとしているものです。

+0

http://stackoverflow.com/questions/25355046/using-nltk-regex-example-in-scikit-learnの可能性の重複-countvectorizer –

+1

@AbhinavArora私はすでにその解決策を見てきました。正規表現以外でも問題ない場合は、3.0.2 –

+0

のようにNLTKの最新バージョンでは解決しません。これはレーキで達成することができます。 – vinod

答えて

6

注意すべき点がいくつかあります。最初は、それらのスペース、改行、およびコメントをすべてパターン文字列に追加すると、それらの文字すべてが正規表現の一部になります。ここを参照してください:

import re 
>>> re.match("[0-9]","3") 
<_sre.SRE_Match object at 0x104caa920> 
>>> re.match("[0-9] #a","3") 
>>> re.match("[0-9] #a","3 #a") 
<_sre.SRE_Match object at 0x104caa718> 

秒あなたは、文字列内のあなたの正規表現パターンを構築する際に特別なシーケンスをエスケープする必要があるということです。たとえば、pattern = "\w"は実際にはpattern = "\\w"である必要があります。あなたがこれらの事柄を説明したら、あなたはあなたの望むトークナイザ用の正規表現を書くことができるはずです。たとえば、あなたはこのような何かが動作するハイフンを追加したい場合:

>>> from sklearn.feature_extraction.text import CountVectorizer 
>>> pattern = "(?u)\\b[\\w-]+\\b" 
>>> 
>>> text = 'I hate traffic-ridden streets.' 
>>> vectorizer = CountVectorizer(stop_words='english',token_pattern=pattern) 
>>> analyze = vectorizer.build_analyzer() 
>>> analyze(text) 
[u'hate', u'traffic-ridden', u'streets'] 
+0

素晴らしいです、ありがとうございます!この簡単な変更は、ハイフネーションされた単語(例:miR-200)の分割を解決しました:cv = CountVectorizer(token_pattern = '(?u)\\ b [\\ w - ] + \\ b'、analyzer = 'word ') –

関連する問題