Regex 在scikit learn CountVectorizer中使用nltk正则表达式示例
我试图使用nltk书中的一个例子,在scikit learn的CountVectorizer中使用正则表达式模式。我看到了一些简单正则表达式的例子,但没有这样的例子:Regex 在scikit learn CountVectorizer中使用nltk正则表达式示例,regex,scikit-learn,nltk,Regex,Scikit Learn,Nltk,我试图使用nltk书中的一个例子,在scikit learn的CountVectorizer中使用正则表达式模式。我看到了一些简单正则表达式的例子,但没有这样的例子: pattern = r''' (?x) # set flag to allow verbose regexps ([A-Z]\.)+ # abbreviations (e.g. U.S.A.) | \w+(-\w+)* # words with optional i
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 love N.Y.C. 100% even with all of its traffic-ridden streets...'
vectorizer = CountVectorizer(stop_words='english',token_pattern=pattern)
analyze = vectorizer.build_analyzer()
analyze(text)
这将产生:
[(u'', u'', u''),
(u'', u'', u''),
(u'', u'', u''),
(u'', u'', u''),
(u'', u'', u''),
(u'', u'', u''),
(u'', u'', u''),
(u'', u'', u''),
(u'', u'', u''),
(u'', u'', u''),
(u'', u'', u''),
(u'', u'-ridden', u''),
(u'', u'', u''),
(u'', u'', u'')]
通过nltk,我得到了完全不同的东西:
nltk.regexp_tokenize(text,pattern)
['I',
“爱”,
“纽约市”,
'100',
“偶数”,
"与",,
“全部”,
“of”,
"它",,
"交通繁忙",,
“街道”,
“…”]
有没有办法让skl CountVectorizer输出相同的内容?我希望在同一个函数调用中使用其他一些方便的功能。TL;DR
from functools import partial
CountVectorizer(analyzer=partial(regexp_tokenize, pattern=pattern))
是使用NLTK标记化器的向量化器
现在来看实际问题:显然,nltk.regexp\u tokenize
对其模式做了一些非常特殊的事情,而scikit learn只是对您提供的模式做了一个re.findall
,并且findall
不喜欢这种模式:
In [33]: re.findall(pattern, text)
Out[33]:
[('', '', ''),
('', '', ''),
('C.', '', ''),
('', '', ''),
('', '', ''),
('', '', ''),
('', '', ''),
('', '', ''),
('', '', ''),
('', '-ridden', ''),
('', '', ''),
('', '', '')]
您必须重写此模式,使其以scikit学习风格工作,或者将NLTK标记器插入scikit学习:
In [41]: from functools import partial
In [42]: v = CountVectorizer(analyzer=partial(regexp_tokenize, pattern=pattern))
In [43]: v.build_analyzer()(text)
Out[43]:
['I',
'love',
'N.Y.C.',
'100',
'even',
'with',
'all',
'of',
'its',
'traffic-ridden',
'streets',
'...']
非常酷-谢谢!你如何将两者结合在一起真是太好了!!