我在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()"
有关如何调整我的功能的任何想法,以检查我的用户原始句子中的特定单词序列,因为它们显示为我的关键字列表?
答案 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]