Select 个句子标记列表中的相关字符串,不改变它们的顺序

Select relevant strings from a list of sentence tokens without changing their order

我正在寻找 select 文本中的相关句子标记。如果列表 'keywords' 中的字符串存在并且列表 'avoid' 中的字符串不存在于句子标记中,则必须创建 selection。但是,如果存在列表 'essentials' 中的字符串,则必须对包含列表 'avoid' 中的字符串的句子标记进行 selected。

这是我试过的代码 运行:

#sentences 是包含句子标记的列表

facts = []

for sent in sentences:
    for keyword in keywords:
        if keyword in sent:
            facts.append(sent)

for fact in facts[:]:
    for i in avoid[:]:
        for essential in essentials[:]:
            if i in fact and essential not in fact:
                facts.remove(fact)

然而,这不包括第二类句子标记,即具有基本字符串的句子标记以及要避免的句子标记。

我做错了什么,有更好的方法吗?提前致谢

我尝试了另一种方式,但它打乱了句子标记的顺序。它是这样的:

for sent in sentences:
    for keyword in keywords:
        if keyword in sent:
            facts.append(sent)

relevant_facts = [fact for fact in facts if not (i in fact for i in avoid)]

for sent in facts:
    for essential in essentials:
        if essential in sent:
            relevant_facts.append(sent)

所以我用了另一种方法。

它在复杂性方面可能不是最优的,但它更容易理解。 所以我创建了 3 个函数,如果句子有关键字、avoid 或 essential 就会返回。

然后对于每个句子,如果它有一个Essential,我们添加它,如果它有一个关键字但没有避免,我们也添加它。否则我们就跳过它。

这是代码:

facts = []

def hasKeyword(sentence):
  for keyword in keywords:
    if keyword in sentence:
      return True
  return False

def hasAvoid(sentence):
  for avoid in avoids:
    if avoid in sentence:
      return True
  return False

def hasEssential(sentence):
  for essential in essentials:
    if essential in sentence:
      return True
  return False


for sent in sentences:
  if hasEssential(sent):
    facts.append(sent)
  elif hasKeyword(sent) and not hasAvoid(sent):
    facts.append(sent)