2013-10-16 69 views
2

我被賦予了在任意文檔(.txt)中查找唯一字以及他們的計數的任務。我也給了一本詞典,如果它在詞典中,那麼文檔中的一個詞就是有效的。這個任務是用附帶數據庫的mysql命令行來解決這個問題。沒有shell腳本,沒有編程。只是mysql命令。如何解析任意文檔到mysql

我爲字典創建了一個表,並將字典從dictionary.txt文件加載到LOAD DATA INFILE 'dictionary.txt' REPLACE INTO TABLE 'words' (word);中,它工作得很好:每個記錄一個字。但是在文檔文件中,沒有真正的分隔符......我可以逐行讀取它,但是如何將每行中的單詞與正則表達式中的單詞進行比較?不是mysql會返回整個字段的內容而不是字段中的匹配單詞?

任何幫助將是偉大的。

編輯: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 ''條款的方式?理想情況下,我想使用\s任何空白(\t\n等),以便http://www.gutenberg.netThisGutenberg-tm,includingLiterary,Archive,tosubscribeeBooks.都是單個記錄。

+0

請問你的文件是什麼樣子?請注意,mysql的正則表達式並不像PCRE或其他版本那樣強大,所以我看不到有效的用例... – HamZa

+2

它看起來很有趣,但是您能否提供示例數據? (在這兩個文件中)與期望的結果? –

+0

'空間'可以作爲分隔符嗎? – Strawberry

回答

1

創建使用文本到每個整條生產線存儲文檔表:

CREATE TABLE document (line TEXT); 

加載文檔插入表中,每行一個行:

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

然後使用以下查詢:

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 

說明:查詢是基於this excellent answer by @Yannis用於統計文本中文本的出現次數。在執行此操作之前,它會爲行的開始和結尾添加空格,並將標點符號(.?!,;:"),製表符和換行符轉換爲空格。 (您可能希望添加到此列表中,例如括號,製表符,斜槓等,具體取決於允許作爲單詞分隔符的內容。)然後,替換對象當然是針對詞典詞的前後添加了空格的。 A 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

您可以嘗試的一件事是將整個文檔加載到表中的一行中,而不是每行一行,然後在列表中包含空格替換的返回字符。預計這會更快。現在不能在我的筆記本電腦上試用,但如果您有任何問題,請告訴我... –