2011-12-15 2 views
3

내 프로젝트는 사람들 팀에 의해 수동으로 작성된 평면 Excel 파일에서 상당한 크기의 콜렉션 + 500K 행의 데이터를 가져옵니다. 이제 문제는 클라이언트 검색을 위해 모두 정규화해야한다는 것입니다. 예를 들어, 회사 필드에는 여러 회사 철자가 있으며 "IBM", "IBM"과 같은 지점이 포함됩니다. 또한 "A46-Rhizonme Pentahol"과 같이 영숫자로 된 제품 이름이 있습니다. SOUNDEX만으로는을 처리 할 수 ​​없습니다.MySQL에서 문자열을 어떻게 토큰화할 수 있습니까?

모든 데이터 입력이 웹 양식을 통해 이루어 지므로 AJAX가 자동으로으로 제안되어이 문제를 장기간에 걸쳐 해결할 수 있습니다. 그러나 그때까지는 기존 데이터를 엄청나게 수집해야합니다. 이것은 내가 여기 읽은 내용에 따라, 좋은 과정이다 내가 믿는 날을 제공합니다 :

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

단계 사용자 정의 퍼지 조회를 작성하고, 퍼지 로직은

  1. 목록을 그룹화 항목
  2. 키워드로
  3. 토큰 화 문자열
  4. 계산 키워드 TF-IDF (전체 주파수 - 역 문서 동시에 빈번한)
  5. 계산 levenshtein dista 가능한 알파 문자열에 대한 키워드 사이의 후부
  6. 계산 Soundex와는
  7. 키워드의 컨텍스트를 결정하는 등 "회사", "제품", "성분"
별도의 DB 테이블로 상황에 따라
  • 장소 키워드,,,

    나는이 문제에 대해 인터넷 검색, StackOverflow 검색, MySQL.com 토론 읽기, 미리 작성된 솔루션 찾기를 시도 해왔다. 어떤 아이디어?

  • 답변

    2

    Google Refine을 확인해야합니다.

    구글 조정은 웹 서비스로 확장, 다른에 하나의 포맷에서 변환, 최대 그것을 청소, 지저분한 데이터로 작업하고하는 Freebase 같은 데이터베이스에 연결하는 전원 도구입니다.

    +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가", ", :;.", "|")

    를 반환 내가 다른 사람이이 유용한 발견 희망

    "이 | 내 | | | 입력 문자열입니다." 건배!

    +0

    나는 이것을 좋아한다.MySQL에서 문자열을 토큰 화하는 유일한 방법은 자신과 같은 저장 함수를 사용하는 것입니다. –

    +1

    그래, 조금 짜증나지만, MySQL은 즐겁게 REGEX를 지원한다. 필자는 PHP 개발자이지만, MySQL에 대해 더 많은 정보를 얻었으며 최적화를 위해 더 많은 로직을 DB로 옮기려고했습니다. –

    +0

    문자열 조작을 할 경우 응용 프로그램 코드에서 더 잘 수행 할 수 있다고 생각합니다. 물론 성능면에서 MySQL을 사용해야하는 상황이 있지만 RDBMS가 그다지 적합하지 않은 작업입니다. 나는 당신이 MySQL의 REGEXP를 보았고 침을 뱉기 시작했다는 것을 확신합니다. 단지 많은 다른 언어들에있는 스위스 육군 칼이 아니라는 것을 깨닫기 위해서입니다. –

    관련 문제