У меня есть список из нескольких тысяч мест и список из миллионов предложений. Моя цель - вернуть список кортежей, в которых сообщается о сопоставленном комментарии и месте, указанном в комментарии. Например:
locations = ['Turin', 'Milan']
state_init = ['NY', 'OK', 'CA']
sent = ['This is a sent about turin. ok?', 'This is a sent about milano.' 'Alan Turing was not from the state of OK.'
result = [('Turin', 'This is a sent about turin. ok?'), ('Milan', 'this is a sent about Melan'), ('OK', 'Alan Turing was not from the state of OK.')]
Словом, я не хочу сопоставлять местоположения, вложенные в другие слова, я не хочу сопоставлять инициалы состояния, если они не написаны заглавными буквами. Если возможно, я бы хотел поймать неправильные орфографические или нечеткие совпадения мест, в которых либо пропущена правильная буква, либо заменена одна правильная буква на неправильную букву, либо есть одна ошибка в упорядочении всех правильных букв. Например:
Milan
должно соответствовать
Melan, Mlian, or Mlan but not Milano
Следующая функция очень хорошо работает для всего, кроме нечеткого сопоставления и возврата кортежа, но я не знаю, как сделать что-либо из этого без цикла for. Не то чтобы я был против использования цикла for, но я все еще не знал бы, как реализовать это таким образом, чтобы он был эффективен в вычислительном отношении.
Есть ли способ добавить эти функции, которые мне интересны, или я пытаюсь сделать слишком много в одной функции?
def find_keyword_comments(sents, locations, state_init):
keywords = '|'.join(locations)
keywords1 = '|'.join(state_init)
word = re.compile(r"^.*\b({})\b.*$".format(locations), re.I)
word1 = re.compile(r"^.*\b({})\b.*$".format(state_init))
newlist = filter(word.match, test_comments)
newlist1 = filter(word1.match, test_comments)
final = list(newlist) + list(newlist1)
return final