Как я могу токенизировать строку в MySQL? - PullRequest
3 голосов
/ 16 декабря 2011

Мой проект импортирует значительную коллекцию + 500К строк данных из плоских файлов Excel , которые вручную создаются группой людей. Теперь проблема в том, что все это необходимо нормализовать для поиска клиентов. Например, поле компании будет иметь несколько вариантов написания компании и включать филиалы, такие как «IBM», а затем «IBM Inc.» и «IBM Japan» и т. д. Кроме того, у меня есть буквенно-цифровые названия продуктов, такие как «A46-Rhizonme Pentahol», с которыми SOUNDEX не может справиться .

.

Я могу решить проблему в долгосрочной перспективе, введя все данные через веб-форму, с автоматическим предложением AJAX . Однако до тех пор мне все еще нужно иметь дело с огромным сбором существующих данных. Это подводит меня к тому, что я считаю хорошим процессом, основываясь на том, что я прочитал здесь:

http://msdn.microsoft.com/en-us/magazine/cc163731.aspx

Шаги для создания пользовательского поиска нечеткой логики и группировки нечеткой логики

  1. Элемент списка
  2. разбить строки на ключевые слова
  3. вычислить ключевое слово TF-IDF (общая частота - обратная частота документа)
  4. вычислить левенштейновское расстояние между ключевыми словами
  5. рассчитать Soundex по доступным альфа-строкам
  6. определить контекст ключевых слов
  7. Поместите ключевые слова в зависимости от контекста в отдельные таблицы БД, такие как «Компании», «Продукты», «Ингредиенты»

Я гуглял, искал StackOverflow, читал обсуждения MySQL.com и т. Д. По этой проблеме, чтобы попытаться найти готовое решение. Есть идеи?

Ответы [ 2 ]

4 голосов
/ 16 декабря 2011

Итак, я сдался и просто сделал функцию строкового токена для mysql. Вот код:

CREATE DEFINER = `root`@`localhost` FUNCTION `NewProc`(in_string VARCHAR(255), delims VARCHAR(255), str_replace VARCHAR(255))
 RETURNS varchar(255)
    DETERMINISTIC
BEGIN
    DECLARE str_len, delim_len, a, b, is_delim INT;
    DECLARE z, y VARBINARY(1);
    DECLARE str_out VARBINARY(256);
    SET str_len = CHAR_LENGTH(in_string), delim_len = CHAR_LENGTH(delims),a = 1, b = 1, is_delim = 0, str_out = '';

    -- get each CHARACTER
    WHILE a <= str_len DO
        SET z = SUBSTRING(in_string, a, 1);
        -- loop through the deliminators
        WHILE b <= delim_len AND is_delim < 1 DO
            SET y = SUBSTRING(delims, b, 1);
            -- search for each deliminator
            IF z = y THEN
                SET is_delim = 1;
            END IF;
            SET b = b + 1;
        END WHILE;

        IF is_delim = 1 THEN
            SET str_out = CONCAT(str_out, str_replace);
        ELSE
            SET str_out = CONCAT(str_out, z);
        END IF;

        SET b = 0;
        SET is_delim = 0;
        SET a = a + 1;
    END WHILE;
    RETURN str_out;
END;

Это называется так:

strtok ("this.is.my.input.string", ".,:;", "|")

и вернется

"this | is | my | input | string"

Надеюсь, кому-то еще это пригодится Ура!

2 голосов
/ 16 декабря 2011

Вы должны проверить Google Refine .

Google Refine - это мощный инструмент для работы с грязными данными, очистки их преобразовывая его из одного формата в другой, расширяя его веб-сервисы и связывание их с базами данных, такими как Freebase.

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