正则表达式/"token_pattern"用于scikit-learn文本矢量化器



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

我想避免使用主题标签(#foobar),数字(以及以数字开头的字符串,即10mg),任何以" RT"(转发)开头的行或"已删除的推文"行。

另外,我想忽略 unicode。

我想保留URL(不是"http://"),并将它们标记为可能存在的任何单词(仅限[A-Za-z]+)。

我对正则表达式有一些经验,但直到现在才需要更复杂的模式。

以下是我对一切的刺伤...这显然不是最好的调查方法,但它确实总结了我目前对正则表达式规则的看法。

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

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.

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

蒂亚

更新:原始数据示例:

如果有帮助,我正在使用熊猫数据框来加载数据。我是熊猫的新手,可能缺少一些基于熊猫的解决方案。

这些原始数据中,我只想从文本和URL中获取单词。这个例子很烂...请进一步评论以帮助我更好地定义它......感谢!

.raw:

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

标记化:

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

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

让我首先说,这绝不应该通过正则表达式解决形状或形式。

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

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

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

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

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

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

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

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

相关内容

  • 没有找到相关文章