2

我的任务是在任意文档 (.txt) 中查找唯一单词及其计数。我也得到了一本字典,如果它在字典中,文档中的单词是有效的。任务是使用带有附加数据库的 mysql 命令行来解决这个问题。没有 shell 脚本,没有编程。只是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 表“文档”,以便我可以执行搜索以达到以下效果'在 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.net, This, Gutenberg-tm,, including, Literary, Archive, to,都是单独的记录。subscribeeBooks.

4

1 回答 1

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 的这个优秀答案,用于计算文本中文本的出现次数。在此之前,它会在行首和行尾添加一个空格,并将标点符号 ( .?!,;:")、制表符和返回字符转换为空格。(您可能希望添加到此列表中,例如括号、制表符、斜杠等,具体取决于允许用作单词分隔符的内容。)当然,替换是针对字典单词进行的,并在前后添加空格。ACROSS JOIN用于将字典中的每个单词与文档中的每一行对齐,aGROUP BY用于SUM每个单词的计数。

示例结果:根据帖子中提到的 const.txt 检查了一个非常小的字典,它给出了以下内容:

word        freq
================
a           97
aardvark    0
and         264
appointment 2
at          23
zyzzogeton  0
于 2013-10-16T22:12:15.593 回答