我写了一个非常幼稚的令牌字符串搜索匹配器。不过,这有点天真,因为使用以下代码,由于'a r i z o n a'的标记方式,它会带回艺术家列表中的所有艺术家。
import collections
import re
def __tokenised_match(artist, search_artist):
matches = []
if len(re.split(r'[\\\s/-]', search_artist)) > 1:
a = [artist.sanitisedOne, search_artist]
bag_of_words = [ collections.Counter(re.findall(r'\w+', words)) for words in a]
sumbags = sum(bag_of_words, collections.Counter())
print(sumbags)
for key, value in sumbags.items():
if len(re.findall(r'\b({k})\b'.format(k=key), search_artist)) > 0 and value > 1:
matches.append(artist)
if len(matches):
return matches
artists = [
{ 'artist': 'A R I Z O N A', 'sanitisedOne': 'a r i z o n a'},
{ 'artist': 'Wutang Clan', 'sanitisedOne': 'wutang clan'}
]
search_artist = 'a r i z o n a'
for artist in artists:
print(__tokenised_match(artist, search_artist))
这将创建一个像这样的sumbags:
Counter({'a':4,'r':2,'i':2,'z':2,'o':2,'n':2})
Counter({'a':2,'wutang':1,'clan':1,'r':1,'i':1,'z':1,'o':1,'n ':1})
这是一种边缘保护套,但我想知道如何才能抵抗这种边缘保护套。匹配“ wutang clang”会很好,但是当它像这样的单个字母时……有点多了,由于匹配两次,会带回每个艺术家。
答案 0 :(得分:2)
基本问题是您仅在一次比赛中就返回成功。对于名称中具有容易匹配的标记的任何艺术家,这都会损害您的准确性。我们可以调整您的算法以匹配一定百分比的单词,或进行字母组合,交集/交集比率,但是...
我建议您使用更强大的功能,例如string similarity,在Python代码中很容易找到。已经打包好了,比编写自己的解决方案容易得多。