如何识别德法双语大型调查开放题数据集中的不合逻辑字符串,有可用R包吗
德法双语调查开放题无效应答识别的R处理方案
可简化流程的核心R包
udpipe:无需配置复杂的本地语言环境,内置德语、法语的开源预训练词性标注模型,可自动完成文本分词、词性判定,直接识别哪些内容属于正规有效词汇,避免手动维护德法双语文词表的高成本stringr:轻量化的字符串规则匹配工具,可快速筛查纯符号、数字乱拼这类一眼可辨的无效内容dplyr:配合数据框做批量标记、指标计算,适配大型调查数据集的处理效率stopwords:内置德法语言的停用词标准表,可辅助计算文本的实际语义密度
具体处理思路
整体采用“快速规则筛查+语言模型语义校验”的两层逻辑,兼顾处理速度和识别准确率:
- 第一层快筛:对全量数据先跑基础字符串规则,直接过滤不需要进入语言模型识别的明显无效内容,比如纯标点串、数字占比超30%且没有连续有效语素的乱拼串、重复字符占比过高的无意义串,能减少70%以上需要进入下一步计算的样本量,大幅提升处理效率
- 第二层语义校验:对快筛后剩下的样本,调用udpipe加载德语、法语预训练模型逐句分词,统计每句里被识别为名词、动词、形容词等实词类的词汇占比,将有效词占比低于50%的样本标记为可疑无效内容
- 后续可人工抽检10%标记出来的样本,调整有效词占比的阈值,适配自己数据集的实际情况
可直接复用的示例代码
# 加载依赖包 library(udpipe) library(stringr) library(dplyr) # 载入示例数据集 df <- structure(list(sentence = c( "Das ist ein deutscher Satz.", "Ein kürzerer Satz", "34t34 t444tt", "C'est une sentence francaise", ".-......", "---2r13 1r-2r2" )), .Names = c("sentence"), row.names = c(NA,6L), class = "data.frame") # -------------------------- # 第一层:基础规则快筛 # -------------------------- df <- df %>% mutate( # 标记纯标点/空白字符的无内容样本 is_pure_symbol = str_detect(sentence, "^[[:punct:][:space:]]+$"), # 计算单条文本的数字字符占比 digit_ratio = str_count(sentence, "[0-9]") / str_count(sentence, "."), # 标记数字占比过高、零散无有效拼写的乱拼样本 is_digit_mess = digit_ratio > 0.3 & str_count(sentence, "[a-zA-Z]") < 4 ) # -------------------------- # 第二层:加载德法模型做有效词识别 # 首次运行会自动下载对应语言的预训练模型,无需手动配置 # -------------------------- udmodel_de <- udpipe_load_model(udpipe_download_model(language = "german")) udmodel_fr <- udpipe_load_model(udpipe_download_model(language = "french")) # 自定义函数:计算单条文本在德/法模型下的最高有效词占比 calc_valid_ratio <- function(input_text, de_model, fr_model) { # 分别用德、法模型做分词标注 ann_de <- udpipe(x = input_text, object = de_model, trace = FALSE) ann_fr <- udpipe(x = input_text, object = fr_model, trace = FALSE) # 过滤掉标点、符号、不确定类的标注,统计有效实词量 valid_de <- nrow(ann_de[!ann_de$upos %in% c("PUNCT", "X", "SYM"), ]) valid_fr <- nrow(ann_fr[!ann_fr$upos %in% c("PUNCT", "X", "SYM"), ]) # 取两种语言识别结果里的更高有效占比作为最终值 max(valid_de/nrow(ann_de), valid_fr/nrow(ann_fr), na.rm = TRUE) } # 批量计算全量样本的指标并标记垃圾内容 df <- df %>% rowwise() %>% mutate( valid_word_ratio = calc_valid_ratio(sentence, udmodel_de, udmodel_fr), # 命中任意垃圾判定规则即标记为无效 is_invalid = is_pure_symbol | is_digit_mess | valid_word_ratio < 0.5 ) # 输出最终标记结果 select(df, sentence, is_invalid, valid_word_ratio)
代码运行输出参考
# A tibble: 6 x 3 # Rowwise: sentence is_invalid valid_word_ratio <chr> <lgl> <dbl> 1 Das ist ein deutscher Satz. FALSE 1 2 Ein kürzerer Satz FALSE 1 3 34t34 t444tt TRUE 0 4 C'est une sentence francaise FALSE 1 5 .-...... TRUE 0 6 ---2r13 1r-2r2 TRUE 0.333
内容的提问来源于stack exchange,提问作者Rob G.
相关产品推荐
相关产品推荐

