scikit-learn 文本矢量化器的正则表达式/“token_pattern”

Posted

技术标签:

【中文标题】scikit-learn 文本矢量化器的正则表达式/“token_pattern”【英文标题】:Regex / "token_pattern" for scikit-learn text Vectorizer 【发布时间】:2015-03-23 15:22:49 【问题描述】:

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

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

另外,我想忽略unicode。

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

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

以下是我对所有内容的尝试……这显然不是最好的调查方法,但它确实总结了我目前对 Regex 规则的看法。

注意:searn doc here 使用字符串上的 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.

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

TIA

更新: 原始数据示例:

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

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

原始:

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]

【问题讨论】:

你能告诉我们你想要的推文解析吗?示例推文和示例令牌。这是 100% 不可行的方法。 @SlaterTyranus,我现在正在处理这个问题......我的输入是来自各种来源、博客、推文等的混合。最初,我制作了一个单独的方法来循环这些行,将它们分成单词,并对其进行正则表达式...但这也很混乱。 【参考方案1】:

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

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

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

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

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

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

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

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

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

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

【讨论】:

这是一个很好的答案,因为它解决了我真正的潜在问题,即“在 NLP 中标记化的最佳方法是什么?”。我已经使用了预处理和停用词添加等等......我只是想也许我应该改用正则表达式......现在我知道,“不”你不使用正则表达式,我应该保留语料库并制作更好地利用变压器。或者,只是获得更好的数据。干杯!

以上是关于scikit-learn 文本矢量化器的正则表达式/“token_pattern”的主要内容,如果未能解决你的问题,请参考以下文章

您如何使用正则表达式“量化”可变数量的行?

如何使用 scikit-learn 为机器学习准备文本数据

了解python scikit-learn中的文本特征提取TfidfVectorizer

scikit-learn 为机器学习

如何在 scikit-learn 管道中的 CountVectorizer 之前包含 SimpleImputer?

scikit-learn CountVectorizer 词汇表和正则表达式