如何将任意文档解析成mysql

时间:2013-10-16 07:10:25

标签: mysql regex

我被赋予了在任意文档(.txt)中查找唯一单词及其计数的任务。我也给了一本字典,如果它在字典中,那么文档中的一个单词是有效的。分配是使用带有附加数据库的mysql命令行来解决此问题。没有shell脚本,没有编程。只是mysql命令。

我为字典创建了一个表,并使用LOAD DATA INFILE 'dictionary.txt' REPLACE INTO TABLE 'words' (word);将fonts.txt文件中的单词加载到它中,并且它工作正常:每个记录一个单词。但是在文档文件中,没有真正的分隔符...我可以逐行读取它,但是如何使用正则表达式将每行中的单词与字典中的单词进行比较? 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表'document',以便我可以搜索到'找到所有唯一的' document.word中的单词document.word在dictionary.word中。返回每个唯一的单词及其计数'。

我尝试用LOAD DATA INFILE 'const.txt' REPLACE INTO TABLE document LINES TERMINATED BY ' ' (word);读取文件,但我需要分隔符为任何空格,而不仅仅是空格。例如,const.txt中的每一行都以\n结束,每行的最后一个单词作为word \ 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,includingLiteraryArchivetosubscribeeBooks.都是个人记录。

1 个答案:

答案 0 :(得分:1)

使用TEXT创建文档表以存储每一行​​:

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

说明:该查询基于@Yannis的this excellent answer,用于计算文本中文本的出现次数。在执行此操作之前,它会在行的开头和结尾添加一个空格,并将标点符号(.?!,;:"),制表符和返回字符转换为空格。 (您可能希望添加到此列表中,例如括号,制表符,斜杠等,具体取决于允许作为单词分隔符的内容。)当然,替换是针对字典单词进行的。之前和之后添加的空间。 CROSS JOIN用于将字典中的每个单词与文档中的每一行对齐,GROUP BY用于SUM每个单词的计数。

示例结果:已针对帖子中提到的const.txt检查了一个非常小的字典,它提供了以下内容:

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