我正在使用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
按照之前的问题建议,但它的行为似乎也发生了变化。
答案 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']