正则表达式/“token_pattern”用于scikit-learn文本Vectorizer

时间:2015-01-24 19:27:12

标签: regex machine-learning nlp scikit-learn tokenize

我使用sklearn使用tf-idf Vectorizer对象进行一些NLP矢量化。可以使用关键字" token_pattern"。

构造此对象

我想避免使用标签(#foobar),数字(和以数字开头的字符串,即10毫克),任何以' RT'开头的行。 (转发),或#34;删除推文"。

另外,我想忽略unicode。

我想保留网址(不是' http://')并将它们标记为任何单词(仅限[A-Za-z] +)存在于其中。

我对Regex有一些经验,但到目前为止还不需要更复杂的模式。

以下是我对所有内容的刺激......它显然不是最好的调查方式,但它总结了我目前对正则表达式规则的看法。

注意:skearn doc here显示默认" token_pattern"在字符串上使用unicode标志,我不明白为什么......也许是单独的问题。

pat2 = r"(?im)([A-Z]+)(?<!^@)([A-Z]+)(?<!^#)([A-Z]+)(?<!^(RT))([A-Z]+)(?<!^Deleted)(?<=^(http://))([A-Z]+)"

我的分手:

(?im)  #Are flags for 'multi-line' and 'case insensitive'

([A-Z]+)(?<!^@) #A negative look back, match [A-Z]+ only if not preceded by 'starts with @'.

(?<=^(http://))([A-Z]+) #A positive look forward, match [A-Z]+ only if 'starts with "http://"' is present.

我觉得这不是一个优雅的解决方案,即使它被调整为工作......

TIA

更新: 原始数据示例:

如果知道有用,我会使用pandas数据帧来加载数据。我是大熊猫的新手,也许还缺少一些基于熊猫的解决方案。

根据这些原始数据,我只想要从文本和网址中获取的字词。 这个例子很糟糕......请进一步评论以帮助我更好地定义...... thx!

生:

http://foxsportswisconsin.ning.com/profiles/blogs/simvastatin-20-mg-pas-cher-sur-internet-acheter-du-simvastatin-20

tokenized:

[foxsportswisconsin, ning, com, profiles, blogs, simvastatin, mg, pas, cher, sur, internet, acheter, du, simvastatin]

1 个答案:

答案 0 :(得分:7)

tl; dr:如果你写了一个超过20个字符的regex你做错了什么,但这可能是一个可以接受的黑客。如果你写了regex超过50个字符,你需要立即停止。

首先我要说的是,这绝不应该是形式,也不应该由正则表达式来解决。

您描述的大多数步骤都应该在预处理或后处理中处理。您不应该尝试使用regex来过滤以Deleted tweetRT开头的内容,您应该在预处理中忽略这些行。

忽略unicode?然后可能值得上网,因为互联网上的所有内容,以及记事本以外的所有内容都是unicode。如果你想删除所有无法在ascii中表示的unicode字符(这是我认为你的意思?),那么编码步骤就是解决这个问题的地方:

<string>.encode('ascii', 'ignore')

就忽略http而言,您应该将http设为停用词。这可以作为另一个参数传递给你正在使用的矢量化器。

一旦完成,您使用的令牌正则表达式(可能仍然不是正则表达式的情况,但这是sklearn提供的接口),实际上非常简单:

'\b[a-zA-Z]\w+\b'

这里要实现的唯一变化是忽略上面提到的10mg这样的数字。

值得注意的是,这种大量的令牌删除会对您尝试进行的任何分析产生负面影响。如果你有一个体面大小的语料库,你不应该删除任何令牌,如果它是小的删除停止词和使用词干器或一个词形变换器是一个很好的方法,但这种令牌删除是不好的做法,将导致过度拟合