我正在使用 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 tweet
或 RT
开头的内容,您应该在 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/