【发布时间】:2011-07-10 17:13:58
【问题描述】:
是否可以从 Postgres 中包含文本字符串的字段中识别不同的单词和每个单词的计数?
【问题讨论】:
标签: postgresql text nlp word-frequency
是否可以从 Postgres 中包含文本字符串的字段中识别不同的单词和每个单词的计数?
【问题讨论】:
标签: postgresql text nlp word-frequency
这样的?
选择一些_pk, regexp_split_to_table(some_column, '\s') as word FROM some_table那么很容易得到不同的词:
选择不同的词 从 ( 选择 regexp_split_to_table(some_column, '\s') 作为单词 FROM some_table ) 吨或获取每个单词的计数:
选择单词,计数(*) 从 ( 选择 regexp_split_to_table(some_column, '\s') 作为单词 FROM some_table ) 吨 按单词分组【讨论】:
lower() 中也可能会有所帮助
单词之间应该用空格''或其他分隔符分隔;不是用 's',除非有意这样做,例如,将 'myWordshere' 视为 'myWord' 和 'here'。
SELECT word, count(*)
FROM (
SELECT regexp_split_to_table(some_column, ' ') as word
FROM some_table
) t
GROUP BY word
【讨论】:
您也可以为此使用 PostgreSQL 文本搜索功能,例如:
SELECT * FROM ts_stat('SELECT to_tsvector(''hello dere hello hello ridiculous'')');
将产生:
word | ndoc | nentry
---------+------+--------
ridicul | 1 | 1
hello | 1 | 3
dere | 1 | 1
(3 rows)
(PostgreSQL 应用与语言相关的词干和停用词删除,这可能是您想要的,也可能不是。可以通过使用 simple 而不是 english 字典来禁用停用词删除和词干提取,见下文。)
嵌套的 SELECT 语句可以是任何产生 tsvector 列的 select 语句,因此您可以替换一个函数,将 to_tsvector 函数应用于任意数量的文本字段,并将它们连接成一个 tsvector,在您的文档的任何子集上,例如:
SELECT * FROM ts_stat('SELECT to_tsvector(''english'',title) || to_tsvector(''english'',body) from my_documents id < 500') ORDER BY nentry DESC;
将产生一个总字数矩阵,该矩阵取自前 500 个文档的 title 和 body 字段,按出现次数降序排列。对于每个单词,您还将获得它出现在的文档数(ndoc 列)。
查看文档了解更多详情:http://www.postgresql.org/docs/current/static/textsearch.html
【讨论】:
WHERE 之前应该有一个id < 500。