我被赋予了在任意文档(.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.net
,This
,Gutenberg-tm,
,including
,Literary
,Archive
,to
,subscribe
,eBooks.
都是个人记录。
答案 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