You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含*标记的PDF分词列表与合并句子的匹配方案咨询

解决带*标记的分词列表与合并后句子的匹配问题

问题核心

需要在包含独立*标记的PDF分词列表中,匹配合并后的目标句子对应的连续单词序列(*可出现在匹配段的首尾或中间,不影响单词匹配)。


方法一:双指针动态跳过*匹配

直接在原始分词列表上遍历,用双指针分别追踪原始分词位置和目标句子的分词位置,遇到*直接跳过,直到完成完整匹配:

步骤:

  1. 统一分词规则:将目标句子按照PDF分词的规则(比如空格分割、大小写保留、缩写/标点处理逻辑)拆分为target_words列表。
  2. 初始化指针与状态:
    • original_idx:遍历原始分词列表的指针,初始为0
    • target_idx:遍历目标分词列表的指针,初始为0
    • match_start:记录匹配段的起始索引,初始为-1
  3. 遍历匹配:
    • 若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
  4. 遍历结束未找到匹配则返回无匹配。

示例验证(对应你的场景):

原始分词列表中,匹配目标句子John is sitting on a desk and working on his laptop时,会跳过desk后的*,完成所有单词匹配后,再将laptop后的*纳入匹配段,最终得到原始索引范围[5,17](对应从John到最后的*)。


方法二:预处理映射法

先对原始分词列表做预处理,再通过映射关系找到原始索引范围,适合长列表的高效匹配:

步骤:

  1. 预处理生成辅助结构:
    • clean_tokens:过滤掉所有*后的纯单词列表
    • original_indices:数组,其中original_indices[k]对应clean_tokens[k]在原始分词列表中的索引
  2. 匹配纯单词序列:在clean_tokens中找到与target_words完全匹配的连续子序列,记录起始位置k_start和结束位置k_end
  3. 映射回原始索引:
    • 原始起始索引为original_indices[k_start]
    • 从original_indices[k_end]的下一个位置开始,遍历原始列表,把所有连续的*都纳入匹配段,最终的match_end是最后一个*的索引(如果没有后续*,则是original_indices[k_end])
  4. 返回匹配区间[match_start, match_end]

关键注意事项

  • 分词规则一致性:这是匹配成功的前提,必须保证目标句子的分词逻辑和PDF分词完全一致(比如是否保留大小写、是否拆分缩写It's为It和's等)
  • 边界情况处理:要覆盖*出现在匹配段开头、中间、结尾的所有场景,比如原始行首带*的情况,方法一会自动跳过开头的*再开始匹配

内容的提问来源于stack exchange,提问作者Rahul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 21:34:54