Ank*_*and 7 python regex nltk scikit-learn
我正在使用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)
Run Code Online (Sandbox Code Playgroud)
我也曾尝试使用nltk的regexp_tokenize,如前面的问题建议,但它的行为似乎也发生了变化.
有几点需要注意.首先,在模式字符串中添加所有这些空格,换行符和注释会使所有这些字符成为正则表达式的一部分.看这里:
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>
Run Code Online (Sandbox Code Playgroud)
第二个是在字符串中构造正则表达式时需要转义特殊序列.例如,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']
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1617 次 |
| 最近记录: |