如何使用Python 3在列表中找到确切的单词序列?

时间:2016-07-08 13:13:22

标签: python python-3.x

我在Windows平台上使用Python 3进行编码。

我正在创建一个函数,该函数将传入用户输入的句子,然后我的函数将.split()并将其作为原始句子中每个单词的列表。

我的功能还会传递一个预定义的单词模式列表,我的函数将会根据用户句子中出现的单词的确切顺序进行匹配。

现在只是这样,我已经可以使用.intersection()找到确切的字词匹配的位置,但我正在寻找确切的单词序列

例如,如果我的用户输入:"I love hairy cats",并且预定义的关键字列表如下所示:["I love", "hairy cats", "I love cats", "love hair"],我的函数应该只指示"I love""hairy cats"因为这两个字符符合预定义列表中出现的指定字词序列。

到目前为止,这是我的代码:

def parse_text(message, keywords):
    newList = []
    Message = message.split()
    Keywords = keywords      # Keywords need to be a list type
    setMessage = set(word for word in Message)
    setKeywords = set(word for word in Keywords)
    newList = setMessage.intersection(setKeywords)

    return newList

只有当我的关键字列表只包含单个单词时,这才能完美地运行。我的问题是当我尝试用多个单词创建列表来表示序列时。

如果我的用户原始邮件是:

message = "Hello world, yes and no"

keywords = ["help", "Hello", "yes", "so"]  # this works, intersec "Hello" and "yes"

keywords = ["help me", "Hello mom", "yes and no", "so"]  # this does not work, just returns empty "set()"

有关如何调整我的功能的任何想法,以检查我的用户原始句子中的特定单词序列,因为它们显示为我的关键字列表?

3 个答案:

答案 0 :(得分:2)

为什么要使用套装?这是一个非常简单的字符串操作:

def parse_text(message, keywords):
     newList = []
     for keyword in keywords:
         if keyword in message:
             newList.append(keyword)
     return newList

或者,使用列表推导更简洁:

def parse_text(message, keywords):
    return [keyword for keyword in keywords if keyword in message]

最后,使用正则表达式强制执行完整单词的另一个表单:

from re import search

def parse_text(message, keywords):
     newList = []
     for keyword in keywords:
         if search(r'\b{}\b'.format(keyword), message):
             newList.append(keyword)
     return newList

答案 1 :(得分:1)

这可以通过将关键字列表转换为列表列表轻松完成,然后检查列出的消息字列表。

def is_sublist(sub_lst, lst):
    n = len(sub_lst)
    return any((sub_lst == lst[i:i + n]) for i in range(len(lst) - n + 1))

message = "Hello world yes and no"
words = message.split()

keywords = ["help me", "Hello mom", "yes and no", "so"]
keywords_lists = [k.split() for k in keywords]
# [['help', 'me'], ['Hello', 'mom'], ['yes', 'and', 'no'], ['so']]

new_sub_lists = [k for k in keywords_lists if is_sublist(k, words)]
new_list = [" ".join(k) for k in new_sub_lists]
# ['yes and no']

is_sublist函数(受@Nas answer启发)远非最佳。

如果您正在寻找一个复杂程度较低的解决方案,那么您应该看看其他人string searching algorithms,因为您的问题可以看作是这样,您的文字就是字母。

答案 2 :(得分:1)

您可以执行以下操作:

    def parse_text(message, keywords):
        return [kw for kw in keywords if kw in message]