Regex 在scikit learn CountVectorizer中使用nltk正则表达式示例

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

我试图使用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)
['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',
 '...']

非常酷-谢谢!你如何将两者结合在一起真是太好了!!