使用tidytext::unnest_tokens生成ngram时如何保留/等特殊字符
最优解决方案
问题根源是tidytext::unnest_tokens()调用底层tokenizers::tokenize_ngrams()时,默认开启了strip_non_alnum = TRUE参数,会自动删除所有非字母、数字的字符,因此3/8这类带斜杠的尺寸会被拆成3和8两个独立token。
直接给底层函数传递strip_non_alnum = FALSE即可解决问题,不需要额外做字符串替换:
library(tidyverse) library(tidytext) tibble(text="My example is 3/8 pipe and 5/8 wrench") %>% unnest_tokens( output = bigrams, input = text, token = "ngrams", n = 2, # 不删除非字母数字字符,保留斜杠 strip_non_alnum = FALSE )
运行后输出和你临时方案的结果完全一致:
# A tibble: 7 × 1 bigrams <chr> 1 my example 2 example is 3 is 3/8 4 3/8 pipe 5 pipe and 6 and 5/8 7 5/8 wrench
方案优势
相比临时替换字符串的方案,这个方法:
- 代码更简洁,不需要两次正则替换操作
- 不会出现替换标记和原文内容冲突的问题(比如原文恰好包含
forwardslash字符串时,临时方案会出错) - 完全利用官方接口的参数实现需求,稳定性更高
内容的提问来源于stack exchange,提问作者Nickerbocker
相关产品推荐
相关产品推荐

