scikit-learn:在标记化时不要分隔连字符
Posted
技术标签:
【中文标题】scikit-learn:在标记化时不要分隔连字符【英文标题】:scikit-learn: don't separate hyphenated words while tokenization 【发布时间】:2016-11-02 02:13:00 【问题描述】:我正在使用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
,正如前面问题中所建议的那样,但它的行为似乎也发生了变化。
【问题讨论】:
***.com/questions/25355046/…的可能重复 @AbhinavArora 我已经看过那个解决方案了。该解决方案不适用于 NLTK 的最新版本,即 3.0.2 如果您可以使用正则表达式以外的其他方法。这可以通过 rake 来实现。 【参考方案1】:有几点需要注意。首先是在模式字符串中添加所有这些空格、换行符和 cmets 会使所有这些字符成为正则表达式的一部分。见这里:
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']
【讨论】:
太棒了,谢谢!这个简单的改变解决了(防止)连字符的分裂(例如,miR-200): cv = CountVectorizer(token_pattern='(?u)\\b[\\w-]+\\b', analyzer='word ') 如果我们有多种情况,例如,如果我们想添加@,'.'到正则表达式,这个模式 = "(?u)\\b[\\w-@.]+\\b" 工作吗?以上是关于scikit-learn:在标记化时不要分隔连字符的主要内容,如果未能解决你的问题,请参考以下文章
如何在 scikit-learn 的 SVM 中使用非整数字符串标签? Python