含*标记的PDF分词列表与合并句子的匹配方案咨询
解决带*标记的分词列表与合并后句子的匹配问题
问题核心
需要在包含独立*标记的PDF分词列表中,匹配合并后的目标句子对应的连续单词序列(*可出现在匹配段的首尾或中间,不影响单词匹配)。
方法一:双指针动态跳过*匹配
直接在原始分词列表上遍历,用双指针分别追踪原始分词位置和目标句子的分词位置,遇到*直接跳过,直到完成完整匹配:
步骤:
- 统一分词规则:将目标句子按照PDF分词的规则(比如空格分割、大小写保留、缩写/标点处理逻辑)拆分为
target_words列表。 - 初始化指针与状态:
original_idx:遍历原始分词列表的指针,初始为0target_idx:遍历目标分词列表的指针,初始为0match_start:记录匹配段的起始索引,初始为-1
- 遍历匹配:
- 若
original_tokens[original_idx]是*:直接original_idx +=1,不移动target_idx - 若
original_tokens[original_idx]等于target_words[target_idx]:- 若
target_idx == 0,记录match_start = original_idx - 同时移动两个指针:
original_idx +=1,target_idx +=1 - 当
target_idx == len(target_words)时,继续遍历原始列表,把后续连续的*都纳入匹配段,直到遇到非*元素或列表结束,记录match_end = original_idx -1,此时匹配完成,返回[match_start, match_end]
- 若
- 若单词不匹配:如果之前已有部分匹配,重置
target_idx=0和match_start=-1,然后original_idx +=1
- 若
- 遍历结束未找到匹配则返回无匹配。
示例验证(对应你的场景):
原始分词列表中,匹配目标句子John is sitting on a desk and working on his laptop时,会跳过desk后的*,完成所有单词匹配后,再将laptop后的*纳入匹配段,最终得到原始索引范围[5,17](对应从John到最后的*)。
方法二:预处理映射法
先对原始分词列表做预处理,再通过映射关系找到原始索引范围,适合长列表的高效匹配:
步骤:
- 预处理生成辅助结构:
clean_tokens:过滤掉所有*后的纯单词列表original_indices:数组,其中original_indices[k]对应clean_tokens[k]在原始分词列表中的索引
- 匹配纯单词序列:在
clean_tokens中找到与target_words完全匹配的连续子序列,记录起始位置k_start和结束位置k_end - 映射回原始索引:
- 原始起始索引为
original_indices[k_start] - 从
original_indices[k_end]的下一个位置开始,遍历原始列表,把所有连续的*都纳入匹配段,最终的match_end是最后一个*的索引(如果没有后续*,则是original_indices[k_end])
- 原始起始索引为
- 返回匹配区间
[match_start, match_end]
关键注意事项
- 分词规则一致性:这是匹配成功的前提,必须保证目标句子的分词逻辑和PDF分词完全一致(比如是否保留大小写、是否拆分缩写
It's为It和's等) - 边界情况处理:要覆盖
*出现在匹配段开头、中间、结尾的所有场景,比如原始行首带*的情况,方法一会自动跳过开头的*再开始匹配
内容的提问来源于stack exchange,提问作者Rahul
相关产品推荐
相关产品推荐

