如何使用OpenNLP标注句内词成分时实现单句单词ID从1起始排序
解决代码
你可以基于已得到的标注结果做二次处理,按单词所属句子重新生成ID即可,完整实现代码如下:
# 确保已加载依赖包 library(NLP) library(openNLP) # 你的原有标注代码 string <- paste0("Last morning, I went to the lake and sat. My dog is the cutest.") ex_string <- as.String(string) init_s_w <- annotate(ex_string, list(Maxent_Sent_Token_Annotator(probs=TRUE), Maxent_Word_Token_Annotator(probs=TRUE))) # 转换标注结果为数据框 anno_df <- as.data.frame(init_s_w) # 拆分句子标注和单词标注 sent_anno <- anno_df[anno_df$type == "sentence", ] word_anno <- anno_df[anno_df$type == "word", ] # 匹配每个单词所属的句子编号 word_anno$sent_belong <- findInterval(word_anno$start, sent_anno$start) # 按句子分组,重新生成单词的顺序ID word_anno$id <- ave(word_anno$id, word_anno$sent_belong, FUN = seq_along) # 移除辅助列,合并句子与单词标注得到最终结果 word_anno <- word_anno[, !colnames(word_anno) %in% "sent_belong"] final_res <- rbind(sent_anno, word_anno) # 查看结果 print(final_res)
实现逻辑
- 先将openNLP返回的标注对象转为结构化的
data.frame方便处理 - 拆分出句子标注和单词标注两个子集
- 通过
findInterval根据单词的起始位置匹配其所属的句子 - 对同一分组(同一句子)内的单词,按顺序重新生成ID,实现每句单词ID从1重新计数
- 合并句子标注与处理后的单词标注,得到符合要求的结果
内容的提问来源于stack exchange,提问作者Linkr1
相关产品推荐
相关产品推荐

