2016-04-08 3 views
1

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

Я хочу, чтобы создать список адресов общего строк, т.е. St, улица, пр, пр, и т.д.

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

Так, например:

101 N Main St будет конвертировать в: 101 N Main St 101 N Main Street 101 North Main St 101 North Main Street

Я могу программировать это на малый масштаб, но не тогда, когда у меня есть около 100 общих строк адреса, которые я хочу в списке.

+0

Если вы еще этого не сделали, вы должны посмотреть на 'ngrams', который является тем, что вы здесь делаете. У SAS есть определенная возможность иметь дело с ними, но есть также много информации о том, как обрабатывать некоторые из них, которые могут быть лучше, чем этот конкретный подход (и могут дать вам подсказки о том, как подходить к программированию шагов данных, даже если литература в основном python/r/c). – Joe

+0

Поиск на lexjansen.com, и вы найдете массу бумаг и кода, который работает по очистке и извлечению адресов. Общий метод состоит в том, чтобы извлечь компоненты, стандартизировать, а затем повторно форматировать. – Reeza

ответ

0

Я бы поставил список распространенных вещей (ST-> STREET и т. Д.) В формат. Затем вы можете создать свой массив (или, пожалуй, вертикальный набор данных), используя PUT и PUTting различных слов с этим форматом, а если возвращать ненулевое значение, добавьте новый бит в новый элемент массива.

Что-то вроде:

Шаг 1. Сделайте первенствует файл с вашими отношениями

Шаг 2. Импорт первенствует файла и использование PROC FORMAT CNTLIN = опция для импорта в формат, и «» для хло = о (другой вариант)

Шаг 3. Нанесите на datastep что-то вроде:

data want; 
    set have; 
    do _i = 1 to countw(address); 
    *use CALL SCAN to find position of i'th word and extract to _ADDCHECK; 
    *use PUT with format created in step 2 to see if it matches; 
    if _addcheck ne ' ' then do; 
     *use CALL SCAN results combined with SUBSTR to put _ADDCHECK back in; 
     output; *or store in an array if you prefer; 
    end; 
    end; 
run; 

Тогда у вас есть то, что это довольно гибкая.

Альтернативный вариант, который по-прежнему работает с форматами, состоит в том, чтобы разделить адрес на отдельные слова, а затем использовать PROC TABULATE с форматом и опцией MULTILABEL (hlo = 'm') для создания большего списка (это должно быть несколько строк, по крайней мере, поначалу).

Смежные вопросы