替换data.fram中的类似句子

2024-10-04 09:26:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面的代码来检查数据框中的句子是否在列表中。如果是这种情况,则部件应替换为“”

import pandas as pd
input_set = pd.DataFrame([['Thanks for the mail Harry', 1], ['Thanks for mailing Harry', 1]], columns=('Sentence', 'ticketID'))


def reduceString(string, listSentences):
 for i in listSentences:
  new_string = string.replace(i, '')
  return(new_string)

listSentences = ['Thanks for the ']

for index, sentence in input_set.iterrows():
 string = reduceString(sentence['Sentence'], listSentences)
 print(string)

一切正常

但是,我想通过包含diff模块使它更健壮一点。这样做的目的是,不仅要删除准确的句子,而且要删除x%相似的句子

因此,我尝试用以下方法调整代码:

import difflib
def reduceString2(string, listSentences):
 for i in listSentences:
  ratio = difflib.SequenceMatcher(None, i, string).ratio()
  print(ratio)
  if(ratio > 0.6):
     new_string = string.replace(i, '')
  return(new_string)

但是,如果我现在尝试运行:

 for index, sentence in input_set.iterrows():
  string = reduceString2(df['Sentence'], listSentences)

它不改变第二句话,而is却碰到了if语句的障碍。有人能告诉我为什么相关的文本没有被替换吗


Tags: 代码inimportnewforinputstringsentence
1条回答
网友
1楼 · 发布于 2024-10-04 09:26:15

首先,第一和第二种算法是完全不同的;第一个将替换字符串中的任何一个句子,而第二个将比较两个字符串是否完全相似(如果有相似的子序列,则不进行比较)

第二,即使stringi相似,您也在尝试替换string中不一定存在的子字符串。您可以使用SequenceMatcher中的一些方法来查找要删除的正确位置:

import difflib
def reduceString2(string, listSentences):
 for i in listSentences:
  matcher = difflib.SequenceMatcher(None, i, string)
  ratio = matcher.ratio()
  print(ratio)
  if(ratio > 0.6):
     blocks = matcher.get_matching_blocks()
     b_first, b_last = blocks[0], blocks[-2]
     new_string = string[:b_first[1]] + string[b_last[1] + b_last[2]:]
  return(new_string)

然而,这种方法尤其会给你:

mail Harry
Harry

因为'Thanks for the '中的最后一个空格与第二句中Harry之前的空格匹配。另一种选择是仅移除替换的块,但这将为您提供:

mail Harry
mailingHarry

这可能不是你所期望的。所以你必须决定如何处理这些匹配的块

此外,您可以考虑使用quick_ratio()real_quick_ratio()作为更快的过滤器(请参见^{} documentation),以及其他一些次要的事情,如字符串的剥离和小写

相关问题 更多 >