我有下面的代码来检查数据框中的句子是否在列表中。如果是这种情况,则部件应替换为“”
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语句的障碍。有人能告诉我为什么相关的文本没有被替换吗
首先,第一和第二种算法是完全不同的;第一个将替换字符串中的任何一个句子,而第二个将比较两个字符串是否完全相似(如果有相似的子序列,则不进行比较)
第二,即使
string
和i
相似,您也在尝试替换string
中不一定存在的子字符串。您可以使用SequenceMatcher
中的一些方法来查找要删除的正确位置:然而,这种方法尤其会给你:
因为
'Thanks for the '
中的最后一个空格与第二句中Harry
之前的空格匹配。另一种选择是仅移除替换的块,但这将为您提供:这可能不是你所期望的。所以你必须决定如何处理这些匹配的块
此外,您可以考虑使用} documentation ),以及其他一些次要的事情,如字符串的剥离和小写
quick_ratio()
或real_quick_ratio()
作为更快的过滤器(请参见^{相关问题 更多 >
编程相关推荐