2011-12-15 122 views
3

我的项目正在从平面Excel文件导入一个可观的集合+ 500K行数据,这些文件是由一组人员手动创建的。现在的问题是,这一切都需要规范化,以便客户搜索。例如,公司字段将包含多个公司拼写,并包含分支,如“IBM”,然后是“IBM Inc.”和“IBM日本”等。此外,我有一些字母数字的产品名称,如“A46-Rhizonme Pentahol”,其中仅SOUNDEX无法处理如何在MySQL中标记字符串?

我可以通过让所有的数据输入都是通过网页形式来解决这个问题,其中包括一个AJAX自动建议。然而在那之前,我仍然需要处理大量现有数据的收集。这使我想起我相信是一个很好的过程,根据我所读到这里:

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

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

  1. 名单项
  2. 记号化字符串插入关键字
  3. 计算关键字TF-IDF(总频率 - 逆文档frequecy)
  4. 计算的Levenshtein DISTA可用字母串
  5. 关键字之间NCE计算探测法
  6. 确定关键字的上下文
  7. 地方的关键字,根据上下文,到单独的数据库表,如“公司”,“产品”,“配料”

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

回答

2

你应该检查出Google Refine

谷歌瑞风是凌乱的数据时,它清洗起来 ,从一种格式转换到另一个,与 Web服务扩展它,并将其链接到喜欢的游离碱数据库的电动工具。

+0

很好的资源,谢谢!我必须看看它的整合程度,因为这是一个高度手动的解决方案。我很好奇看看过程是否可以自动化。 – 2011-12-16 16:16:19

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”, “:;。”, “|”)

和将返回

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

我希望别人认为这很有用。干杯!

+0

我喜欢这个。在MySQL中对字符串进行标记的唯一方法是使用像您的存储函数。 – 2011-12-16 20:25:21