You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用quanteda分词时remove_punct为何无法去除撇号?

解决quanteda分词时撇号未被去除的问题

这是quanteda的默认设计——remove_punct = TRUE不会移除单词内部的撇号(比如don't里的'),因为这类撇号被视作单词的组成部分,而非独立标点。下面是几种可行的解决办法:

方法1:用正则替换移除撇号

在分词后通过tokens_replace配合正则表达式,直接清除所有类型的撇号:

all.tokens <-
  tokens(
    my.corpus,
    remove_punct = TRUE,
    remove_numbers = TRUE,
    remove_symbols = TRUE,
    remove_url = TRUE
  ) %>% 
  tokens_replace(pattern = "[‘’']", replacement = "") %>%
  tokens_tolower() %>% 
  tokens_select(pattern = stopwords("en"), selection = "remove")

正则[‘’']覆盖了直撇号和左右弯撇号,能处理不同格式的文本。

方法2:自定义要移除的标点集合

quanteda允许用户指定punctuation参数,把撇号加入默认的移除列表:

# 扩展默认标点集合,加入各类撇号
custom_punct <- c(quanteda:::punctuation, "'", "‘", "’")

all.tokens <-
  tokens(
    my.corpus,
    remove_punct = TRUE,
    punctuation = custom_punct,
    remove_numbers = TRUE,
    remove_symbols = TRUE,
    remove_url = TRUE
  ) %>% 
  tokens_tolower() %>% 
  tokens_select(pattern = stopwords("en"), selection = "remove")

方法3:分词前预处理文本

如果需要更彻底的控制,先在语料层面用字符串工具清除撇号,再进行分词:

# 预处理语料,移除所有撇号
my.corpus_preprocessed <- corpus(stringr::str_replace_all(my.corpus, "[‘’']", ""))

all.tokens <-
  tokens(
    my.corpus_preprocessed,
    remove_punct = TRUE,
    remove_numbers = TRUE,
    remove_symbols = TRUE,
    remove_url = TRUE
  ) %>% 
  tokens_tolower() %>% 
  tokens_select(pattern = stopwords("en"), selection = "remove")

内容的提问来源于stack exchange,提问作者mgd_aus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 02:43:12