KeyATM能否使用词根作为关键词合并同根词汇变体?
KeyATM匹配同根词为同一关键词的解决方案
KeyATM本身不支持通配符词根匹配,你可以通过预处理阶段统一同根词的词型来实现需求,Snowball词干提取无法合并free和freedom是Porter词干算法的固有特性,可改用以下两种方案:
方案1:自定义词映射批量替换(最适配free*通配符需求)
该方案完全可控,只处理你指定的词根匹配范围,不会改动其他词汇的表达:
- 先提取当前语料的所有唯一词型,用正则匹配筛选所有符合
^free规则的词汇,拿到所有free*的同根变体 - 构建替换字典,把所有筛选到的变体统一映射为目标关键词
free - 对分词后的语料执行批量替换,再把处理后的语料输入KeyATM即可
参考代码:
library(quanteda) # 替换示例,corp_tokens为你已分词好的quanteda tokens对象 free_variants <- grep("^free", types(corp_tokens), value = TRUE) replace_dict <- setNames(rep("free", length(free_variants)), free_variants) corp_tokens_clean <- tokens_replace(corp_tokens, pattern = names(replace_dict), replacement = replace_dict)
处理完成后,你在KeyATM的关键词列表里仅需填写free,所有原文本中出现的free、freedom、freely等同根词都会被识别为该关键词。
方案2:用词形归并工具处理通用同根合并
如果你需要批量处理大量词根的同根词,可使用比Snowball词干提取准确率更高的词形归并工具,比如spacyr包对接的spaCy自然语言处理工具,会基于语义归并同根词:
library(spacyr) # 初始化spaCy模型,需提前安装en_core_web_sm模型 spacy_initialize(model = "en_core_web_sm") # 对原始文本向量做词形归并 parsed_res <- spacy_parse(your_raw_text_vector, lemma = TRUE) # 提取归并后的词元序列,再转换为KeyATM要求的输入格式即可 lemmatized_corp <- split(parsed_res$lemma, parsed_res$doc_id)
提示:对于free和freedom这类词根与派生名词的组合,部分词形归并模型可能不会自动合并,这种情况下优先使用方案1的自定义映射即可。
内容的提问来源于stack exchange,提问作者AndrewG
相关产品推荐
相关产品推荐

