如何使用标记化列表作为查询基础来搜索列表中的字符串?

时间:2018-05-17 07:44:43

标签: python

我有一个分析圣经经文文本的程序。我有一个词典,因为简洁,我将以此为例:

{
    "song": ["Song of Songs", "Song of Solomon"],
    "exod": ["Bilowgii", "Zanafilla", "1 Moseboken","Exodus", "2 Mosebog", "2 Mose", "Shemot", "2 Mooseksen", "Exode", "Esodo"]
}

此外,我还有一个消息的标记化列表,如果消息中有一本书,我必须寻找该消息(另一个例子)。

`["my", "favorite", "verse", "is", "Song", "of", "Solomon", "1:2", "but", "my", "second", "favorite", "is", "Exodus", "2:15"]

当然,我现在可以遍历两首"歌曲"和" exod"并且没有问题地找出Exodus,因为它不是具有多个单词的书名。但是,我怎样才能发现所罗门之歌是什么?#34;是基于标记化字符串的dict中的一个项目?

如果无法找到针对此特定方法的解决方案,我是否可以通过这种方式简化流程?

注意:我正试图找到一种方法来重建字符串"查看这样的字符串是否在列表中。换句话说,如果重建的字符串在这样的列表中,我希望能够知道列表的键是什么。 (即我应该得到#34;歌曲"来自["我的#34;,"最喜欢的","诗歌","是" ,"歌曲","","所罗门"," 1:2"])

我的解决方案是不再对字符串进行标记,并将字符串与@ ezod的答案结合使用。

2 个答案:

答案 0 :(得分:1)

在非标记化句子中查找所有歌曲

所以,找到你在字典上迭代的所有歌曲并累积结果:

def find_verses(book_dict, target_sentence):
    result = []
    for key, verse_list in book_dict.items():
        for verse in verse_list:
            if verse in target_sentence:
                result.append((key, verse))
    return result

编辑2:删除令牌列表中的令牌搜索,因为我们会松开短语。

编辑3:添加代码以查找所有经文

答案 1 :(得分:1)

您正在尝试检查列表是否是另一个列表的子列表。您可以检查较大列表的不同部分,并将其与标记化查询字符串进行比较。

query = ["Song", "of", "Salomon"]
text = ["my", "favorite", "verse", "is", "Song", "of", "Solomon", "1:2", "but", "my", "second", "favorite", "is", "Exodus", "2:15"]

is_sublist = any((query == text[i:i+len(query)] for i in range(0, len(text) - len(query))))
# is_sublist will be True