gpt4 book ai didi

python:在另一个字符串中查找名称的最佳方法

转载 作者:行者123 更新时间:2023-12-01 02:34:42 25 4
gpt4 key购买 nike

我正在处理来自多个来源的一些汇总成员(member)数据。我的一列中有姓名,另一列中有很长的成员备忘录字符串。我想要将名字与成员(member)备忘录相匹配的最佳方式。

例如,

我想要找到最好的方法:

'Barack Obama' 

在以下字符串中,由于此数据是聚合的并且格式可能不同。以下是一些示例:

"Member Data REWNEW:EX PAID ID:234242 Barack Obama WASHINGTON DC LAST CO 2834298:EEXE:00WIE"
"Member Data REWNEW:EX PAID ID:234242 Barack Hussein Obama WASHINGTON DC LAST CO 2834298:EEXE:00WIE"
"Member Data REWNEW:EX PAID ID:234242 Obama Barack WASHINGTON DC LAST CO 2834298:EEXE:00WIE"
"Member Data REWNEW:EX PAID ID:234242 Barack H Obama WASHINGTON DC LAST CO 2834298:EEXE:00WIE"

过去,我使用fuzzywuzzy进行模糊逻辑匹配。如果我比较两个字符串,但不尝试在另一个较长的字符串中查找一个字符串,那么这种方法往往效果很好。例如:

from fuzzywuzzy import fuzz
from fuzzywuzzy import fuzz

print(fuzz.ratio("Barack Obama", "Barack Obama"))
print(fuzz.ratio("Michelle Obama", "Barack Obama"))
print(fuzz.ratio("Barack Obama", "Member Data REWNEW:EX PAID ID:234242 Barack Hussein Obama WASHINGTON DC LAST CO 2834298:EEXE:00WIE"))
print(fuzz.ratio("Michelle Obama", "Member Data REWNEW:EX PAID ID:234242 Barack Hussein Obama WASHINGTON DC LAST CO 2834298:EEXE:00WIE"))

100
54
22
16

很明显,前两个非常不同(100 与 54),但后两个似乎并没有那么不同,因此这不是最好的方法。

有人对如何最好地实现这种类型的字符串搜索有任何想法吗?

非常感谢!

更新1:

我尝试过:

memo_string="Member Data REWNEW:EX PAID ID:234242 Barack Hussein Obama WASHINGTON DC LAST CO 2834298:EEXE:00WIE"
search_terms = "Barack Obama"

memo_words = memo_string.split(" ")
search_term_count = len(search_terms.split(" "))
memo_slices = []
for i in range(len(memo_words) - search_term_count):
memo_slices.append(" ".join(memo_words[i:i+search_term_count]))
max_for_memo = 0
best_match_in_memo = None
for memo_slice in memo_slices:
fuzz_score = fuzz.ratio(search_terms, memo_slice)
if fuzz_score > max_for_memo:
max_for_memo = fuzz_score
best_match_in_memo = memo_slice

print(max_for_memo)

I also tried with search_terms = 'Michelle Obama'

这两个分数分别为 52 和 50,这仍然带来了我在开头所说的挑战,即我想要某种逻辑来更明确地将两者分开。

想法?

非常感谢!

最佳答案

最简单的方法就是检查名字和姓氏。在您的示例中,您可以执行以下操作:

search_terms = "Barack Obama"
matches = []
for memo_string in memos_list:
for word in search_terms.split(" "):
if word not in memo_string:
break
else:
matches.append(memo_string) # triggers when the for loop doesn't break

这将匹配包含您的确切搜索词的所有备忘录。但这并不检查术语是否彼此相邻,而是要求它们完全匹配。

为了进行模糊匹配,您可以将搜索词与备忘录字符串片段进行比较(为了简洁,省略了一些序言)。

memo_words = memo_string.split(" ")
search_term_count = len(search_terms.split(" "))
memo_slices = []
for i in range(memo_words - search_term_count):
memo_slices.append(" ".join(memo_words[i:i+search_term_count]))
max_for_memo = 0
best_match_in_memo = None
for memo_slice in memo_slices:
fuzz_score = fuzz.ratio(search_terms, memo_slice)
if fuzz_score > max_for_memo:
max_for_memo = fuzz_score
best_match_in_memo = memo_slice

这应该允许您比较较长文本和较短文本中匹配的模糊分数。一旦您想要开始将搜索词与目标字符串中不同大小的切片进行匹配,它就会变得有点复杂,但您可能应该在那时研究正则表达式(我只是想我会提供一些更多可能的解决方案)。 p>

关于python:在另一个字符串中查找名称的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46376203/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com