Regex/"token_pattern"用于 scikit-learn 文本向量化器

标签 regex machine-learning nlp scikit-learn tokenize

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

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

另外,我想忽略unicode。

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

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

下面是我对所有内容的尝试...这显然不是最好的调查方式,但它确实总结了我目前对正则表达式规则的看法。

注意:skearn 文档 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]

最佳答案

tl;dr:如果您编写的 regex 超过 20 个字符,那么您就做错了,但这可能是一个可以接受的 hack。如果您编写的正则表达式超过 50 个字符,则需要立即停止。

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

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

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

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

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

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

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

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

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

关于Regex/"token_pattern"用于 scikit-learn 文本向量化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28129365/

相关文章:

python - 如何避免 NLTK 的句子分词器在缩写时 split ?

r - 如何删除R中第n个分隔符之后的所有内容?

r - 为什么 gsubfn 会省略部分匹配项?

python - 正则表达式仅匹配美元符号、金钱、小数

python - python 2.7+ 中的组引用无效

python - 如何将数据集拆分为训练集和验证集以保持类之间的比率?

python - 将多个自定义类与 Pipeline sklearn (Python) 结合使用

python - 卷积自动编码器图像尺寸误差

nlp - 阿拉伯语词形还原和斯坦福 NLP

java - 使用gate处理文档时出现内存不足异常