基于分词列表查询,如何在字典列表中匹配多词圣经书名?
多词圣经书名匹配的解决方案
我来给你梳理下这个问题的可行思路,两种方案供你参考:
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
相关产品推荐
相关产品推荐

