【问题标题】:using nltk regex example in scikit-learn CountVectorizer在 scikit-learn CountVectorizer 中使用 nltk 正则表达式示例
【发布时间】:2014-10-10 21:05:42
【问题描述】:

我试图将 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 输出相同的东西?我希望使用在同一个函数调用中包含的其他一些方便的功能。

【问题讨论】:

    标签: regex scikit-learn nltk


    【解决方案1】:

    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',
     '...']
    

    【讨论】:

    • 非常酷 - 谢谢!你把两者结合起来真是太好了!!
    猜你喜欢
    • 2019-03-14
    • 2020-05-05
    • 2017-02-25
    • 1970-01-01
    • 2020-01-15
    • 2012-11-11
    • 2015-03-23
    • 2019-06-08
    • 2016-03-03
    相关资源
    最近更新 更多