如何在MySQL中对字符串进行标记?

时间:2011-12-15 21:21:24

标签: mysql normalization levenshtein-distance soundex tf-idf

我的项目正在导入一个相当大的集合+来自平面Excel文件的500K行数据,这些数据由一组人员手动创建。现在的问题是,所有这些都需要规范化,以便客户端搜索。例如,公司字段将包含多个公司拼写并包含分支,例如“IBM”和“IBM Inc.”另外,我的产品名称是字母数字,例如“A46-Rhizonme Pentahol”, SOUNDEX单独无法处理

通过使用 AJAX自动建议将所有数据输入通过网络表单,我可以长期解决问题。然而,在那之前,我仍然需要处理大量现有数据。根据我在这里读到的内容,这让我想到了一个我认为是一个好的过程:

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

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

  1. 列表项
  2. 将字符串标记为关键字
  3. 计算关键字TF-IDF(总频率 - 逆文档频率)
  4. 计算关键词之间的levenshtein距离
  5. 计算可用字母字符串上的Soundex
  6. 确定关键字的上下文
  7. 根据上下文将关键字放入单独的数据库表中,例如“公司”,“产品”,“成分”
  8. 我一直在谷歌搜索,搜索StackOverflow,阅读有关此问题的MySQL.com讨论等,试图找到预建的解决方案。有什么想法吗?

2 个答案:

答案 0 :(得分: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”,“。,:;”,“|”)

并将返回

“this | is | my | input | string”

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

答案 1 :(得分:2)

您应该查看Google Refine

  

Google Refine是一款处理凌乱数据并清理数据的强大工具   up,将它从一种格式转换为另一种格式,并将其扩展   Web服务,并将其链接到Freebase等数据库。