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

基于分词列表查询,如何在字典列表中匹配多词圣经书名?

多词圣经书名匹配的解决方案

我来给你梳理下这个问题的可行思路,两种方案供你参考:

1. 基于分词列表的滑动窗口匹配法

既然已经有了分词后的消息列表,我们可以用滑动窗口的思路精准匹配多词书名,步骤如下:

  • 先把原始字典转换成「书名→字典键」的反向映射,方便快速查找:比如把"Song of Solomon"和"Song of Songs"都映射到"song"
  • 找出字典里最长的多词书名的词数(比如这里最长是3词),作为滑动窗口的最大长度
  • 遍历分词列表,从每个位置开始,优先尝试最长窗口的子序列,匹配到就记录对应键,同时跳过已匹配的词避免重复

代码示例:

# 原始字典
book_dict = { 
    "song": ["Song of Songs", "Song of Solomon"], 
    "exod": ["Bilowgii", "Zanafilla", "1 Moseboken","Exodus", "2 Mosebog", "2 Mose", "Shemot", "2 Mooseksen", "Exode", "Esodo"] 
}

# 构建反向映射:书名 -> 对应字典键
title_to_key = {}
for key, titles in book_dict.items():
    for title in titles:
        title_to_key[title] = key

# 分词后的消息列表
tokenized_msg = ["my", "favorite", "verse", "is", "Song", "of", "Solomon", "1:2", "but", "my", "second", "favorite", "is", "Exodus", "2:15"]

# 计算最长书名的词数,作为滑动窗口的最大长度
max_title_words = max(len(title.split()) for title in title_to_key.keys())

matches = []
i = 0
while i < len(tokenized_msg):
    matched = False
    # 从最长窗口开始尝试,避免短书名截断长书名
    for window_size in range(max_title_words, 0, -1):
        if i + window_size > len(tokenized_msg):
            continue
        # 拼接窗口内的词成候选书名
        candidate = ' '.join(tokenized_msg[i:i+window_size])
        if candidate in title_to_key:
            matches.append((title_to_key[candidate], candidate))
            i += window_size  # 跳过已匹配的词,继续后面的遍历
            matched = True
            break
    if not matched:
        i += 1  # 没匹配到,移动到下一个词

print(matches)
# 输出:[('song', 'Song of Solomon'), ('exod', 'Exodus')]

2. 简化方案:直接处理原字符串

如果觉得分词后的滑动窗口逻辑有点繁琐,你的临时方案其实非常合理——直接处理原字符串会更简单直观:

  • 先把所有书名按长度从长到短排序(优先匹配长书名,避免出现先匹配"Song"而漏掉"Song of Solomon"的情况)
  • 遍历排序后的书名,在原字符串中查找匹配,找到后记录对应键,同时可以把匹配到的内容替换成占位符防止重复匹配

代码示例:

original_msg = "my favorite verse is Song of Solomon 1:2 but my second favorite is Exodus 2:15"

# 按书名长度降序排序,确保长书名优先匹配
sorted_titles = sorted(title_to_key.items(), key=lambda x: len(x[0]), reverse=True)

matches = []
temp_msg = original_msg
for title, key in sorted_titles:
    if title in temp_msg:
        matches.append((key, title))
        # 替换匹配内容,避免重复检测
        temp_msg = temp_msg.replace(title, "")

print(matches)
# 输出:[('song', 'Song of Solomon'), ('exod', 'Exodus')]

这个简化方案不用处理分词后的列表,逻辑更易懂,完全能满足你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:15:36