我有一个名为ngram_sightings的Postgres 9.1表。每行都是在文档中查看ngram的记录。 ngram可以在给定文档中多次出现。
CREATE TABLE ngram_sightings
(
ngram VARCHAR,
doc_id INTEGER
);
我希望在另一个名为ngram_counts的表中汇总此表。
CREATE TABLE ngram_counts
(
ngram VARCHAR PRIMARY INDEX,
-- the number of unique doc_ids for a given ngram
doc_count INTEGER,
-- the count of a given ngram in ngram_sightings
corpus_count INTEGER
);
这样做的最佳方式是什么?
ngram_sightings是大约10亿行。 我应该首先在ngram_sightings.ngram上创建索引吗?
答案 0 :(得分:1)
给它一个机会!
INSERT INTO ngram_counts (ngram, doc_count, corpus_count)
SELECT
ngram
, count(distinct doc_id) AS doc_count
, count(*) AS corpus_count
FROM ngram_counts
GROUP BY ngram;
- 编辑 -
这是使用一些临时表的更长版本。首先,计算每个ngram与之关联的文档数量。我正在使用“tf”代表“术语频率”而“df”代表“doc频率”,因为你正朝着tf-idf vectorization的方向前进,你也可以使用标准语言,它将有助于接下来的几个步骤。
CREATE TEMPORARY TABLE ngram_df AS
SELECT
ngram
, count(distinct doc_id) AS df
FROM ngram_counts
GROUP BY ngram;
现在您可以为每个ngram的总计数创建表。
CREATE TEMPORARY TABLE ngram_tf AS
SELECT
ngram
, count(*) AS tf
FROM ngram_counts
GROUP BY ngram;
然后在ngram上加入两个。
CREATE TABLE ngram_tfidf AS
SELECT
tf.ngram
, tf.tf
, df.df
FROM ngram_tf
INNER JOIN ngram_df ON ngram_tf.ngram = ngram_df.ngram;
此时,我希望你会在ngram上查找ngram,所以在ngram上索引最后一个表是有意义的。让我发布!