scikit-learn:在标记化时不要分隔带连字符的单词

时间:2016-06-30 06:23:26

标签: python regex scikit-learn nltk

我正在使用CountVectorizer,并且不想将带连字符的单词分成不同的标记。我尝试将不同的pregex模式传递到token_pattern参数中,但是没有能够获得所需的结果。

以下是我的尝试:

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 hate traffic-ridden streets.'
vectorizer = CountVectorizer(stop_words='english',token_pattern=pattern)
analyze = vectorizer.build_analyzer()
analyze(text)

我还尝试使用nltk regexp_tokenize按照之前的问题建议,但它的行为似乎也发生了变化。

1 个答案:

答案 0 :(得分:7)

有几点需要注意。首先,在模式字符串中添加所有这些空格,换行符和注释会使所有这些字符成为正则表达式的一部分。见这里:

import re
>>> re.match("[0-9]","3")
<_sre.SRE_Match object at 0x104caa920>
>>> re.match("[0-9] #a","3")
>>> re.match("[0-9] #a","3 #a")
<_sre.SRE_Match object at 0x104caa718>

第二个是在字符串中构造正则表达式时需要转义特殊序列。例如,pattern = "\w"确实需要pattern = "\\w"。一旦你考虑到这些东西,你应该能够为你想要的标记器编写正则表达式。例如,如果您只想添加连字符,则可以使用以下内容:

>>> from sklearn.feature_extraction.text import CountVectorizer
>>> pattern = "(?u)\\b[\\w-]+\\b"
>>> 
>>> text = 'I hate traffic-ridden streets.'
>>> vectorizer = CountVectorizer(stop_words='english',token_pattern=pattern)
>>> analyze = vectorizer.build_analyzer()
>>> analyze(text)
[u'hate', u'traffic-ridden', u'streets']