Алгоритм, чтобы увидеть, был ли адрес написан в предложении - PullRequest
3 голосов
/ 04 июня 2019

Я хочу создать алгоритм, который может видеть, записан ли адрес в предложении.

Например, если пользователь пишет:

"Привет, мой адрес - Линкольнстрит 27, Foobarcity. Ты можешь забрать посылку?"

А адрес пользователя - Lincolnstreet 27, Foobarcity , тогда я хочу алгоритм, который может обнаружить, что адрес был упомянут в предложении.

Я уже знаю название и номер улицы пользователя, почтовый индекс и название города.

Это также должно быть нечетким, поскольку люди могут делать опечатки или вносить небольшие изменения в свой адрес, который они написали в предложении. Однако не обязательно, чтобы алгоритм отлавливал все события всегда, независимо от их опечатки, поскольку это, очевидно, невозможно. Это нормально с полунаивным решением.

Я посмотрел вдаль Левенштейна, но не могу понять, как заставить это работать для этого точного сценария. Я также изучил Longest Common Subsequence, и там та же проблема.

Есть идеи? Мне не обязательно заботиться о языке программирования.

Меня не интересует решение нейронной сети - я искренне верю, что его можно решить с помощью относительно наивного алгоритма - я просто не знаю, с чего начать.

Ответы [ 3 ]

3 голосов
/ 06 июня 2019

Принимая предложение за большую строку, вы в основном хотите увидеть следующее:

  • присутствует название улицы
  • присутствует название города
  • присутствует номер улицы

Вы можете проверить заказ, если хотите, но вы хотите, чтобы он был нечетким, поэтому мы пока проигнорируем это. Возможно, было бы целесообразно проверить совпадение, что можно сделать, посмотрев начало и конец подстрок и сравнив их.

Ваш предпочтительный язык почти наверняка имеет какую-то функцию .contains () и, вероятно, имеет нечеткий режим.

В этом случае

if (sentence.roughly_contains(streetname) and sentence.roughly_contains(cityname) and sentence.contains(streetnumber)) {
    return true;
}

если вы не можете найти функцию нечеткого соответствия, напишите ее! Согласование нечеткого текста C # предоставляет нам https://blogs.msdn.microsoft.com/toub/2006/05/05/generic-levenshtein-edit-distance-with-c/, что дает нам хорошую общую реализацию нечеткого поиска, которую вы можете использовать для создания функции .roughly_contains ().

Порядок мудрый; чек примерно соответствует шаблону:

//where all string.[start|end] are integers, locations can be found trivially or with the help of google once you know their presence
overlap(string1, string2) {
    if (string1.start > string2.end || string1.end < string2.start) {
        return false;
    }
    else {
        return true
    }
}

(предполагается, что вы знаете адреса независимо от предложения)

0 голосов
/ 06 июня 2019

Это немного сложнее, чем вы хотите, но ответы там наверняка помогут вам: Как разобрать произвольную улицу / почтовый адрес из текста и по компонентам

Очень наивный способ решить проблему, хотя бы частично, состоит в том, чтобы разбить и предложения, и адрес на слова, а затем, для каждого слова в адресе, проверить, к каким словам в строке он относится чаще всего. похожий на. Затем усредните результаты и проверьте, превышает ли среднее значение пороговое значение. Конечно, это не учитывает ни позицию, ни семантику.

0 голосов
/ 06 июня 2019

Интересно, не могли бы вы просто разбить его на каждое предложение?Вставьте его в поисковик, такой как Google, и посмотрите, какие ссылки он содержит, включая предлагаемые исправления / для какого поискового запроса он фактически показывает результаты.Немного тяжело в использовании интернета, но я думаю, что это может сработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...