2013-10-16 2 views
2

임의의 문서 (.txt)와 그 수에 고유 한 단어를 찾기위한 지정이 주어졌습니다. 나는 사전도 받았고, 문서에있는 단어는 사전에 있다면 유효합니다. 할당은 첨부 된 데이터베이스와 함께 mysql 커맨드 라인을 사용하여이 문제를 해결하는 것이다. 쉘 스크립팅, 프로그래밍이 필요 없습니다. 그냥 mysql 명령.임의의 문서를 mysql으로 구문 분석하는 방법

사전을위한 테이블을 만들고 dictionary.txt 파일의 단어를 LOAD DATA INFILE 'dictionary.txt' REPLACE INTO TABLE 'words' (word);으로로드했습니다. 레코드 당 한 단어 씩 성공했습니다. 그러나 문서 파일에는 실제 구분 기호가 없습니다. 줄 단위로 읽을 수도 있지만 정규식을 사용하여 각 줄의 단어와 사전의 단어를 비교하는 방법은 무엇입니까? mysql이 필드 내에서 일치하는 단어 대신 전체 필드 내용을 반환하지 않습니까?

어떤 도움도 좋은 것입니다.

EDIT : SQLFiddle은 현재 다운 된 것 같습니다. 여기에 지금까지 한 일이다 :

CREATE TABLE dictionary (word VARCHAR(50) NOT NULL UNIQUE, freq INT DEFAULT 0);

LOAD DATA INFILE 'dictionary.txt' REPLACE INTO TABLE dictionary (word);

SELECT * FROM dictionary; 수율 :

+------------------------------+------+ 
| word       | freq | 
+------------------------------+------+ 
| a       | 0 | 
| aa       | 0 | 
| aaa       | 0 | 
| aaas       | 0 | 
| aah       | 0 | 
| aal       | 0 | 
| aalii      | 0 | 
| aam       | 0 | 
| aani       | 0 | 
| aardvark      | 0 | 
| aardvarks     | 0 | 
| aardwolf      | 0 | 
| aardwolves     | 0 | 
| aargh      | 0 | 
| aarhus      | 0 | 
| aaron      | 0 | 
. 
. 
. 
. 
| zymotize      | 0 | 
| zymotoxic     | 0 | 
| zymurgy      | 0 | 
| zyrenian      | 0 | 
| zyrian      | 0 | 
| zyryan      | 0 | 
| zythem      | 0 | 
| zythia      | 0 | 
| zythum      | 0 | 
| zyzomys      | 0 | 
| zyzzogeton     | 0 | 
+------------------------------+------+ 
300248 rows in set (0.29 sec) 

하는 dictionary.txt 파일은 한 줄에 하나의 단어입니다. (여기에는 빈도 카운트가 필요하지 않음).

그 다음에는 임의의 텍스트 문서, 예를 들어 http://www.usconstitution.net/const.txt을 가져 와서 '문서의 모든 고유 단어 찾기'를 검색 할 수있는 '문서'와 같은 mysql 테이블을 읽고 싶습니다. .word 여기서 document.word는 dictionary.word에 있습니다. 각각의 유일한 단어와 그 수를 돌려 준다 '.

LOAD DATA INFILE 'const.txt' REPLACE INTO TABLE document LINES TERMINATED BY ' ' (word);으로 파일을 읽으려고했으나 공백이 아닌 공백으로 구분 기호가 필요합니다. 예를 들어, const.txt의 각 행은 \n으로 끝나고 각 행의 마지막 단어는 \ nanotherword 단어로 테이블에 배치됩니다. 나는 구두점 (단어, 단어, 단어, 단어 등)으로 끝나는 단어에 대해 지금 당장 걱정하지 않아도됩니다.

예 : SELECT * FROM DOCUMENT WHERE word REGEXP '\n'; 수율 :

| http://www.gutenberg.net 

This    | 
| Gutenberg-tm, 
including      | 
| Literary 
Archive       | 
| to 
subscribe        | 
| eBooks. 
            | 
+---------------------------------------------+ 
3356 rows in set (0.00 sec) 

LINES TERMINATED BY '' 절에 대한 정규식 구분 기호를 사용하는 방법이 있나요? 이상적으로, 내가 그렇게 공백 (\t, \n, 등)에 대한 \s을 사용하고 싶습니다 그 http://www.gutenberg.net, This, Gutenberg-tm,, including, Literary, Archive, to, subscribe, eBooks.은 모두 개별 레코드입니다.

+0

어떻게 파일이 생겼는데? mysql의 regex flavor는 PCRE 나 다른 맛과 같이 강력하지 않으므로 유효한 케이스를 실제로 볼 수는 없다는 것을주의하십시오. – HamZa

+2

샘플 데이터를 제공 할 수 있습니까? (두 파일 모두에서) 원하는 결과가 나타 납니까? –

+0

'공백'을 구분 기호로 사용할 수 있습니까? – Strawberry

답변

1

각 라인 전체 저장하기 위해 텍스트를 사용하여 문서에 대한 테이블 만들기 :

SELECT word, 
     SUM(
      ROUND((LENGTH(CONCAT(' ', line, ' ')) - 
        LENGTH(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
         REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
         CONCAT(' ', LOWER(line), ' '), 
         '.', ' '), 
         '?', ' '), 
         '!', ' '), 
         ',', ' '), 
         ';', ' '), 
         ':', ' '), 
         '"', ' '), 
         '\n', ' '), 
         '\r', ' '), 
         '\t', ' '), 
         CONCAT(' ', word, ' '), ' '))) 
       /LENGTH(word)) 
     ) AS freq 
FROM dictionary 
CROSS JOIN document 
GROUP BY word 
:

LOAD DATA INFILE 'const.txt' INTO TABLE document LINES TERMINATED BY '\n' (line); 

그런 다음 다음 쿼리를 사용 : 한 줄에 하나의 행과 테이블에

CREATE TABLE document (line TEXT); 

로드 문서를

설명 : 쿼리는 this excellent answer @Yannis는 텍스트 내에서 텍스트의 출현을 계산합니다. 이렇게하기 전에 줄의 시작과 끝 모두에 공백을 추가하고 구두점 (.?!,;:"), 탭을 변환하고 문자를 공백으로 변환합니다. (단어 분리 기호로 허용되는 것에 따라 대괄호, 탭, 슬래시 등이 목록에 추가 할 수 있습니다.) 대체 단어는 앞뒤에 공백이 추가 된 사전 단어에 대해 수행됩니다 . CROSS JOIN은 문서의 각 줄에 대해 사전의 각 단어를 정렬하는 데 사용되고 GROUP BY은 각 단어의 수를 SUM으로 사용합니다.

샘플 결과 : 유무는 게시물에 언급 된 const.txt에 대한 아주 작은 사전을 확인하고 다음과 같은 주었다

word  freq 
================ 
a   97 
aardvark 0 
and   264 
appointment 2 
at   23 
zyzzogeton 0 
+0

작은 사전에 유용합니다. 고마워요. 난 그냥 큰 사전 (300,000 + 단어)에 대한 효율적으로 실행 얻을 수없는 것. 어쩌면 나는 그것을 조정하는 방법에 대해 계속 생각할 것이다. – ejsuncy

+0

한 가지 방법은 한 줄에 하나의 행이 아닌 테이블의 한 행에 전체 문서를로드 한 다음 공백으로 바뀌는 목록에 반환 문자를 포함시키는 것입니다. 이것이 더 빠를 것으로 기대합니다. 지금 당장은 노트북으로는 안되지만 문제가 있으면 알려주세요. –

관련 문제