regex - 在 scikit-learn CountVectorizer 中使用 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 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/

相关文章:

html - 使用 powershell 检索 HTML 中的文本

javascript - 如何在指定符号前添加符号?

regex - 正则表达式的值小于X

python - 从语料库中删除非 ASCII

javascript - 带输入掩码的千位分隔符

python - 我正在尝试实现 GridSearchCV 来调整 K 最近邻分类器的参数

python - LabelEncoder 指定 DataFrame 中的类

algorithm - Scikit-Learn RFECV 仅基于网格分数的特征数量

python - NLTK - 在没有 Downloader UI 的情况下从命令行下载除 corpara 之外的所有 nltk 数据

python - 使用 NLTK 进行西类牙语 POS 标记?