我试图将 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 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)
['我', '爱', '纽约', '100', '甚至', '和', '全部', '的', '它是', “交通拥堵”, ‘街道’, '...']
有没有办法让 skl CountVectorizer 输出相同的东西?我希望使用同一函数调用中包含的其他一些方便的功能。
最佳答案
TL;DR
from functools import partial
CountVectorizer(analyzer=partial(regexp_tokenize, pattern=pattern))
是一个使用 NLTK 分词器的矢量化器。
现在针对实际问题:显然 nltk.regexp_tokenize
对其模式做了一些非常特殊的事情,而 scikit-learn 只是用您给出的模式执行 re.findall
它,并且 findall
不喜欢这种模式:
In [33]: re.findall(pattern, text)
Out[33]:
[('', '', ''),
('', '', ''),
('C.', '', ''),
('', '', ''),
('', '', ''),
('', '', ''),
('', '', ''),
('', '', ''),
('', '', ''),
('', '-ridden', ''),
('', '', ''),
('', '', '')]
您必须重写此模式以使其以 scikit-learn 风格工作,或者将 NLTK 分词器插入 scikit-learn:
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',
'...']
关于regex - 在 scikit-learn CountVectorizer 中使用 nltk 正则表达式示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25355046/