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)

我也尝试过使用 nltkregexp_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

保留字符串中的分隔标记列表[关闭]

如何通过分隔符标记字符串?

高手,在sql语句里如何提取出分隔符前后的字符???不要太长的。

标记一个字符串,并将每个分隔符放在它自己的标记中

如何将字符串拆分为分隔符也是标记的数组? [复制]