Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在MySQL中标记字符串?_Mysql_Normalization_Levenshtein Distance_Soundex_Tf Idf - Fatal编程技术网

如何在MySQL中标记字符串?

如何在MySQL中标记字符串?,mysql,normalization,levenshtein-distance,soundex,tf-idf,Mysql,Normalization,Levenshtein Distance,Soundex,Tf Idf,我的项目正在从平面Excel文件导入一个相当大的集合+500K行数据,这些文件是由一组人员手动创建的。现在的问题是,对于客户端搜索,所有这些都需要规范化。例如,company字段将有多个公司拼写,并包括分支机构,如“IBM”,然后是“IBM Inc.”和“IBM Japan”等。此外,我还有字母数字的产品名称,如“A46 Rhizonme Pentahol”,这是SOUNDEX单独无法处理的 我可以通过使用AJAX自动建议通过web表单输入所有数据,从长远来看解决这个问题。然而,在那之前,我仍然

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

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

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

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

    你应该去看看

    GoogleRefine是处理凌乱数据、清理数据的有力工具 向上,将其从一种格式转换为另一种格式,并使用 web服务,并将其链接到Freebase等数据库


    所以,我放弃了,只是为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;
    
    CREATE DEFINER=`root`@`localhost`函数`NewProc`(在字符串VARCHAR(255)、delims VARCHAR(255)、str_replace VARCHAR(255)中)
    返回varchar(255)
    确定性
    开始
    声明str_len,delim_len,a,b,is_delim INT;
    声明z,y变量为二进制(1);
    声明str_out VARBINARY(256);
    设置str_len=CHAR_LENGTH(in_string),delim_len=CHAR_LENGTH(delims),a=1,b=1,is_delim=0,str_out='';
    --获取每个字符
    
    虽然是一个伟大的资源,谢谢!我必须看看它集成得有多好,因为这是一个高度手动的解决方案。我很好奇这个过程是否可以自动化。我喜欢这个。在MySQL中标记字符串的唯一方法是使用像您这样的存储函数。是的,这有点烦人,不过有趣的是MySQL支持正则表达式。我是一名PHP开发人员,但我一直在深入研究MySQL,并尝试将更多的逻辑移到DB中进行优化。我认为在进行字符串操作的情况下,最好在应用程序代码中这样做。当然,在某些情况下,在性能方面,您可能会被迫使用MySQL,但这是RDBMS并不特别适合的任务。我敢肯定你在MySQL上看到了REGEXP并开始垂涎三尺,但却意识到它不是瑞士军刀,而是在许多其他语言中。。。我想问一下,您是否对使用PHP和使用MySQL函数的令牌化进行过时间比较?mike-没有,因为性能取决于用例。如果您只想对几行进行标记化,那么可以在PH中查询行,在PHP中进行标记化,并输出到HTML/INSERT/UPDATE等。如果您在MySQL中进行中等复杂的搜索或过滤,使用此标记化函数是最好的方法,而不是在PHP中提取每一行进行处理。