3

我的项目是从一组人手动创建的平面 Excel 文件中导入一个相当大的集合 +500K 行数据。现在的问题是,这一切都需要标准化,以供客户搜索。例如,公司字段将有多个公司拼写并包括分支,例如“IBM”,然后是“IBM Inc.”。和“IBM Japan”等。另外,我有一些字母数字的产品名称,例如“A46-Rhizonme Pentahol”,单靠 SOUNDEX 无法处理

从长远来看,我可以通过使用AJAX auto-suggest的 Web 表单输入所有数据来解决这个问题。然而,在那之前,我仍然需要处理大量现有数据的收集。根据我在这里读到的内容,这让我想到了我认为是一个很好的过程:

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

创建自定义模糊逻辑查找和模糊逻辑分组的步骤

  1. 项目清单
  2. 将字符串标记为关键字
  3. 计算关键字 TF-IDF(总频率 - 逆文档频率)
  4. 计算关键字之间的levenshtein距离
  5. 计算可用 alpha 字符串的 Soundex
  6. 确定关键字的上下文
  7. 根据上下文将关键字放入单独的数据库表中,例如“Companies”、“Products”、“Ingredients”

我一直在谷歌搜索、搜索 StackOverflow、阅读 MySQL.com 讨论等关于这个问题,试图找到一个预建的解决方案。有任何想法吗?

4

2 回答 2

4

所以,我放弃了,只是为 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",".,:;"," | ")

并将返回

“这 | 是 | 我的 | 输入 | 字符串”

我希望其他人觉得这很有用。干杯!

于 2011-12-16T16:18:59.487 回答
2

您应该查看Google Refine

Google Refine 是一种强大的工具,用于处理杂乱的数据、清理数据、将其从一种格式转换为另一种格式、使用 Web 服务对其进行扩展,并将其链接到 Freebase 等数据库。

于 2011-12-15T21:23:56.197 回答