nltk - 为什么 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
解决方案
下划线 ( '_'
) 通常不是有意义的标点符号,但在编程和文本处理中通常被视为“单词”字符。
例如,常见的正则表达式语法用于\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),以实施最适合他们需求的标记化。
推荐阅读
- python-3.x - OSError: [WinError 10013] 在 PyCharm 环境中运行时,尝试以访问权限禁止的方式访问套接字
- sql-server - 在 Azure SQL Server 上安装和配置 Polybase - 找不到存储过程“sp_configure”
- r - 在小标题中添加和删除字符串组件
- javascript - 在构造函数的构造函数中不调用 setter 中的验证
- file - golang 中偶尔长(500+ 毫秒)写入或刷新时间
- php - 如何使用自定义面板 Drupal 8 扩展管理配置菜单
- pagination - 具有自定义帖子类型的木材分页
- r - rvest:read_html() 无法读取包含“#”的 URL
- sql-server - Using temporary table data to update first table, then use identity from first table and same temp data to update second table
- c# - VS2017 - 整合 Newtonsoft.Json.dll (但它可以很容易地成为任何不同版本的 nuget 包)