Я написал очень наивное совпадение поиска строки токена. Это немного слишком наивно, хотя, как и в следующем коде, это вернуло бы всех художников в списке художников из-за того, что '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))
это создаст сумбаг, как это:
Счетчик ({'a': 4, 'r': 2, 'i': 2, 'z': 2, 'o': 2, 'n': 2})
Счетчик ({'a': 2, 'wutang': 1, 'clan': 1, 'r': 1, 'i': 1, 'z': 1, 'o': 1, 'n ': 1})
это что-то вроде крайнего случая, но мне интересно, как я могу противостоять этому виду крайнего случая. было бы хорошо, если бы «wutang clang» совпадал, но когда он состоит из таких букв, как эта… это немного много и он вернет каждого артиста из-за совпадения дважды.