如何移除不同版本停用词?现有代码残留dont类停用词的非自定义解法
解决quanteda中停用词残留(如"dont")的问题
嘿,这个问题我之前也踩过坑!原因其实很直白:你先移除了标点符号,导致像don't这类收缩词直接变成了dont,但stopwords("smart")列表里根本没有dont这个条目——它只收录了do、not这类完整形式的停用词,自然没法匹配移除。
不用自定义停用词列表的话,只要调整处理顺序并利用quanteda内置的工具就能搞定:
核心思路
先拆分收缩词(把带撇号的收缩形式拆成完整单词),再移除标点、数字等冗余内容。这样拆分后的do和not会被smart停用词列表正确识别并移除,不会留下dont这类残留。
修正后的代码
dfm <- tokens(df$text) %>% tokens_contractions() %>% # 拆分收缩词:don't → do not, I'm → I am等 tokens_remove(punct = TRUE, numbers = TRUE, symbols = TRUE) %>% tokens_remove(pattern = stopwords(source = "smart")) %>% tokens_wordstem()
为什么这能生效?
tokens_contractions()是quanteda专门处理英语收缩词的函数,能识别所有标准收缩形式并拆成对应的完整单词组合。- 先拆分再移除标点,就不会破坏收缩词的结构,拆分出来的
do和not都是smart停用词列表里的条目,后续的tokens_remove就能把它们彻底清理掉。
如果还有类似cant(来自can't)这类残留,用同样的方法也能解决——只要先处理收缩词,再做标点移除就行。
内容的提问来源于stack exchange,提问作者Nathalie




