首页 > 解决方案 > 为什么 gensim 在预处理过程中会忽略下划线?

问题描述

通过 gensim 源,我注意到该simple_preprocess实用程序功能清除了所有标点符号,除了那些以下划线开头的单词,_. 是否有一个原因?

def simple_preprocess(doc, deacc=False, min_len=2, max_len=15):
    tokens = [
        token for token in tokenize(doc, lower=True, deacc=deacc, errors='ignore')
        if min_len <= len(token) <= max_len and not token.startswith('_')
    ]
    return tokens

标签: nltkgensim

解决方案


下划线 ( '_') 通常不是有意义的标点符号,但在编程和文本处理中通常被视为“单词”字符。

例如,常见的正则表达式语法用于\w表示“单词字符”。根据https://www.regular-expressions.info/shorthand.html

\w代表“单词字符”。它总是匹配 ASCII 字符 [A-Za-z0-9_]。注意包含下划线和数字。在大多数支持 Unicode 的风格中,\w包括来自其他脚本的许多字符。关于实际包含哪些字符存在很多不一致之处。通常包括来自字母脚本和表意文字的字母和数字。除了下划线和非数字的数字符号之外的连接标点符号可能包含也可能不包含。XML Schema 和 XPath 甚至包括\w. 同样,Java、JavaScript 和 PCRE 仅匹配带有\w.

因此,它通常用于创作或其他文本预处理步骤,以连接其他作为一个单元保存在一起的字母/数字组。因此,它通常不会与其他真正的标点符号一起清除。

您引用的代码还做了其他事情,与您关于清除标点符号的问题不同:它会丢弃以_.

我不知道为什么会这样。在某些时候,代码可能在设计时考虑了某种特定的文本格式,其中前导下划线标记是语义上不重要的格式指令。

gensim 中的simple_preprocess()函数只是一个快速而肮脏的基线,有助于内部测试和紧凑的初学者教程。它不应该被视为“最佳实践”。

真正的项目应该更多地考虑对他们的数据和目的有意义的词标记化——或者寻找具有更多选项的库,或者自定义方法(仍然不需要超过几行 Python),以实施最适合他们需求的标记化。


推荐阅读