changes for archiving.
This commit is contained in:
@@ -1,138 +1,28 @@
|
||||
srun=srun -p compute-bigmem -A comdata --mem-per-cpu=9g --time=200:00:00 -c 40
|
||||
srun_huge=srun -p compute-hugemem -A comdata --mem=724g --time=200:00:00 -c 40
|
||||
|
||||
#all: /gscratch/comdata/output/reddit_similarity/tfidf/comment_terms_130k.parquet /gscratch/comdata/output/reddit_similarity/tfidf/comment_authors_130k.parquet /gscratch/comdata/output/reddit_similarity/tfidf_weekly/comment_terms_130k.parquet /gscratch/comdata/output/reddit_similarity/tfidf_weekly/comment_authors_130k.parquet
|
||||
# srun_singularity=source /gscratch/comdata/users/nathante/cdsc_reddit/bin/activate && srun_singularity.sh
|
||||
# srun_singularity_huge=source /gscratch/comdata/users/nathante/cdsc_reddit/bin/activate && srun_singularity_huge.sh
|
||||
srun=srun -p compute-bigmem -A comdata --mem-per-cpu=9g --time=200:00:00 -c 40
|
||||
srun_huge=srun -p compute-hugemem -A comdata --mem-per-cpu=9g --time=200:00:00 -c 40
|
||||
similarity_data=/gscratch/scrubbed/comdata/reddit_similarity
|
||||
similarity_data=../../data/reddit_similarity
|
||||
tfidf_data=${similarity_data}/tfidf
|
||||
tfidf_weekly_data=${similarity_data}/tfidf_weekly
|
||||
similarity_weekly_data=${similarity_data}/weekly
|
||||
lsi_components=[10,50,100,200,300,400,500,600,700,850,1000,1500]
|
||||
lsi_components=[10,50,100,200,300,400,500,600,700,850]
|
||||
|
||||
lsi_similarities: ${similarity_data}/subreddit_comment_terms_10k_LSI ${similarity_data}/subreddit_comment_authors-tf_10k_LSI ${similarity_data}/subreddit_comment_authors_10k_LSI ${similarity_data}/subreddit_comment_terms_30k_LSI ${similarity_data}/subreddit_comment_authors-tf_30k_LSI ${similarity_data}/subreddit_comment_authors_30k_LSI
|
||||
lsi_similarities: ${similarity_data}/subreddit_comment_authors-tf_10k_LSI
|
||||
|
||||
all: ${similarity_data}/subreddit_comment_authors-tf_10k.feather
|
||||
|
||||
all: ${tfidf_data}/comment_terms_30k.parquet ${tfidf_data}/comment_terms_10k.parquet ${tfidf_data}/comment_authors_30k.parquet ${tfidf_data}/comment_authors_10k.parquet ${similarity_data}/subreddit_comment_authors_30k.feather ${similarity_data}/subreddit_comment_authors_10k.feather ${similarity_data}/subreddit_comment_terms_10k.feather ${similarity_data}/subreddit_comment_terms_30k.feather ${similarity_data}/subreddit_comment_authors-tf_30k.feather ${similarity_data}/subreddit_comment_authors-tf_10k.feather
|
||||
${similarity_data}/subreddit_comment_authors-tf_10k_LSI: ${tfidf_data}/comment_authors_100k.parquet similarities_helper.py ${similarity_data}/subreddits_by_num_comments_nonsfw.csv
|
||||
${srun_huge} /bin/bash -c "source ~/.bashrc; python3 lsi_similarities.py author-tf --outfile=${similarity_data}/subreddit_comment_authors-tf_10k_LSI --topN=10000 --n_components=${lsi_components} --min_df=10 --inpath=$<"
|
||||
|
||||
#all: ${tfidf_data}/comment_terms_100k.parquet ${tfidf_data}/comment_terms_30k.parquet ${tfidf_data}/comment_terms_10k.parquet ${tfidf_data}/comment_authors_100k.parquet ${tfidf_data}/comment_authors_30k.parquet ${tfidf_data}/comment_authors_10k.parquet ${similarity_data}/subreddit_comment_authors_30k.feather ${similarity_data}/subreddit_comment_authors_10k.feather ${similarity_data}/subreddit_comment_terms_10k.feather ${similarity_data}/subreddit_comment_terms_30k.feather ${similarity_data}/subreddit_comment_authors-tf_30k.feather ${similarity_data}/subreddit_comment_authors-tf_10k.feather ${similarity_data}/subreddit_comment_terms_100k.feather ${similarity_data}/subreddit_comment_authors_100k.feather ${similarity_data}/subreddit_comment_authors-tf_100k.feather ${similarity_weekly_data}/comment_terms.parquet
|
||||
${similarity_data}/subreddits_by_num_comments_nonsfw.csv: ../../data/reddit_submissions_by_subreddit.parquet ../../data/reddit_comments_by_subreddit.parquet
|
||||
../start_spark_and_run.sh 3 top_subreddits_by_comments.py
|
||||
|
||||
#${tfidf_weekly_data}/comment_terms_100k.parquet ${tfidf_weekly_data}/comment_authors_100k.parquet ${tfidf_weekly_data}/comment_terms_30k.parquet ${tfidf_weekly_data}/comment_authors_30k.parquet ${similarity_weekly_data}/comment_terms_100k.parquet ${similarity_weekly_data}/comment_authors_100k.parquet ${similarity_weekly_data}/comment_terms_30k.parquet ${similarity_weekly_data}/comment_authors_30k.parquet
|
||||
${tfidf_data}/comment_authors_100k.parquet: ../../data/reddit_ngrams/comment_authors_sorted.parquet ${similarity_data}/subreddits_by_num_comments_nonsfw.csv
|
||||
../start_spark_and_run.sh 3 tfidf.py authors --topN=100000 --inpath=$< --outpath=${tfidf_data}/comment_authors_100k.parquet
|
||||
|
||||
# /gscratch/comdata/output/reddit_similarity/subreddit_comment_authors_130k.parquet /gscratch/comdata/output/reddit_similarity/subreddit_comment_authors_130k.parquet /gscratch/comdata/output/reddit_similarity/subreddit_author_tf_similarities_130k.parquet /gscratch/comdata/output/reddit_similarity/subreddit_comment_terms_130k.parquet /gscratch/comdata/output/reddit_similarity/comment_terms_weekly_130k.parquet
|
||||
../../data/reddit_ngrams/comment_authors_sorted.parquet:
|
||||
$(MAKE) -C ../ngrams
|
||||
|
||||
# all: /gscratch/comdata/output/reddit_similarity/subreddit_comment_terms_25000.parquet /gscratch/comdata/output/reddit_similarity/subreddit_comment_authors_25000.parquet /gscratch/comdata/output/reddit_similarity/subreddit_comment_authors_10000.parquet /gscratch/comdata/output/reddit_similarity/comment_terms_10000_weekly.parquet
|
||||
../../data/reddit_submissions_by_subreddit.parquet:
|
||||
$(MAKE) -C ../datasets
|
||||
|
||||
${similarity_weekly_data}/comment_terms.parquet: weekly_cosine_similarities.py similarities_helper.py /gscratch/comdata/output/reddit_ngrams/comment_terms.parquet ${similarity_data}/subreddits_by_num_comments_nonsfw.csv ${tfidf_weekly_data}/comment_terms.parquet
|
||||
${srun} python3 weekly_cosine_similarities.py terms --topN=10000 --outfile=${similarity_weekly_data}/comment_terms.parquet
|
||||
|
||||
${similarity_data}/subreddit_comment_terms_10k.feather: ${tfidf_data}/comment_terms_100k.parquet similarities_helper.py
|
||||
${srun} python3 cosine_similarities.py term --outfile=${similarity_data}/subreddit_comment_terms_10k.feather --topN=10000
|
||||
|
||||
${similarity_data}/subreddit_comment_terms_10k_LSI: ${tfidf_data}/comment_terms_100k.parquet similarities_helper.py
|
||||
${srun_huge} python3 lsi_similarities.py term --outfile=${similarity_data}/subreddit_comment_terms_10k_LSI --topN=10000 --n_components=${lsi_components} --min_df=200
|
||||
|
||||
${similarity_data}/subreddit_comment_terms_30k_LSI: ${tfidf_data}/comment_terms_100k.parquet similarities_helper.py
|
||||
${srun_huge} python3 lsi_similarities.py term --outfile=${similarity_data}/subreddit_comment_terms_30k_LSI --topN=30000 --n_components=${lsi_components} --min_df=200 --inpath=$<
|
||||
|
||||
${similarity_data}/subreddit_comment_terms_30k.feather: ${tfidf_data}/comment_terms_30k.parquet similarities_helper.py
|
||||
${srun_huge} python3 cosine_similarities.py term --outfile=${similarity_data}/subreddit_comment_terms_30k.feather --topN=30000 --inpath=$<
|
||||
|
||||
${similarity_data}/subreddit_comment_authors_30k.feather: ${tfidf_data}/comment_authors_30k.parquet similarities_helper.py
|
||||
${srun_huge} python3 cosine_similarities.py author --outfile=${similarity_data}/subreddit_comment_authors_30k.feather --topN=30000 --inpath=$<
|
||||
|
||||
${similarity_data}/subreddit_comment_authors_10k.feather: ${tfidf_data}/comment_authors_10k.parquet similarities_helper.py
|
||||
${srun_huge} python3 cosine_similarities.py author --outfile=${similarity_data}/subreddit_comment_authors_10k.feather --topN=10000 --inpath=$<
|
||||
|
||||
${similarity_data}/subreddit_comment_authors_10k_LSI: ${tfidf_data}/comment_authors_100k.parquet similarities_helper.py
|
||||
${srun_huge} python3 lsi_similarities.py author --outfile=${similarity_data}/subreddit_comment_authors_10k_LSI --topN=10000 --n_components=${lsi_components} --min_df=10 --inpath=$<
|
||||
|
||||
${similarity_data}/subreddit_comment_authors_30k_LSI: ${tfidf_data}/comment_authors_100k.parquet similarities_helper.py
|
||||
${srun_huge} python3 lsi_similarities.py author --outfile=${similarity_data}/subreddit_comment_authors_30k_LSI --topN=30000 --n_components=${lsi_components} --min_df=10 --inpath=$<
|
||||
|
||||
${similarity_data}/subreddit_comment_authors-tf_30k.feather: ${tfidf_data}/comment_authors_100k.parquet similarities_helper.py
|
||||
${srun} python3 cosine_similarities.py author-tf --outfile=${similarity_data}/subreddit_comment_authors-tf_30k.feather --topN=30000 --inpath=$<
|
||||
|
||||
${similarity_data}/subreddit_comment_authors-tf_10k.feather: ${tfidf_data}/comment_authors_100k.parquet similarities_helper.py
|
||||
${srun} python3 cosine_similarities.py author-tf --outfile=${similarity_data}/subreddit_comment_authors-tf_10k.feather --topN=10000
|
||||
|
||||
${similarity_data}/subreddit_comment_authors-tf_10k_LSI: ${tfidf_data}/comment_authors_100k.parquet similarities_helper.py
|
||||
${srun_huge} python3 lsi_similarities.py author-tf --outfile=${similarity_data}/subreddit_comment_authors-tf_10k_LSI --topN=10000 --n_components=${lsi_components} --min_df=10 --inpath=$<
|
||||
|
||||
${similarity_data}/subreddit_comment_authors-tf_30k_LSI: ${tfidf_data}/comment_authors_100k.parquet similarities_helper.py
|
||||
${srun_huge} python3 lsi_similarities.py author-tf --outfile=${similarity_data}/subreddit_comment_authors-tf_30k_LSI --topN=30000 --n_components=${lsi_components} --min_df=10 --inpath=$<
|
||||
|
||||
${similarity_data}/subreddit_comment_terms_100k.feather: ${tfidf_data}/comment_terms_100k.parquet similarities_helper.py
|
||||
${srun} python3 cosine_similarities.py term --outfile=${similarity_data}/subreddit_comment_terms_100k.feather --topN=100000
|
||||
|
||||
${similarity_data}/subreddit_comment_authors_100k.feather: ${tfidf_data}/comment_authors_100k.parquet similarities_helper.py
|
||||
${srun} python3 cosine_similarities.py author --outfile=${similarity_data}/subreddit_comment_authors_100k.feather --topN=100000
|
||||
|
||||
${similarity_data}/subreddit_comment_authors-tf_100k.feather: ${tfidf_data}/comment_authors_100k.parquet similarities_helper.py
|
||||
${srun} python3 cosine_similarities.py author-tf --outfile=${similarity_data}/subreddit_comment_authors-tf_100k.feather --topN=100000
|
||||
|
||||
${similarity_data}/subreddits_by_num_comments_nonsfw.csv:
|
||||
start_spark_and_run.sh 3 top_subreddits_by_comments.py
|
||||
|
||||
${tfidf_data}/comment_terms_100k.parquet: /gscratch/comdata/output/reddit_ngrams/comment_terms.parquet ${similarity_data}/subreddits_by_num_comments_nonsfw.csv
|
||||
# mkdir -p ${tfidf_data}/
|
||||
start_spark_and_run.sh 3 tfidf.py terms --topN=100000 --inpath=$< --outpath=${tfidf_data}/comment_terms_100k.parquet
|
||||
|
||||
${tfidf_data}/comment_terms_30k.feather: /gscratch/comdata/output/reddit_ngrams/comment_terms.parquet ${similarity_data}/subreddits_by_num_comments_nonsfw.csv
|
||||
# mkdir -p ${tfidf_data}/
|
||||
start_spark_and_run.sh 3 tfidf.py terms --topN=30000 --inpath=$< --outpath=${tfidf_data}/comment_terms_30k.feather
|
||||
|
||||
${tfidf_data}/comment_terms_10k.feather: /gscratch/comdata/output/reddit_ngrams/comment_terms.parquet ${similarity_data}/subreddits_by_num_comments_nonsfw.csv
|
||||
# mkdir -p ${tfidf_data}/
|
||||
start_spark_and_run.sh 3 tfidf.py terms --topN=10000 --inpath=$< --outpath=${tfidf_data}/comment_terms_10k.feather
|
||||
|
||||
${tfidf_data}/comment_authors_100k.parquet: /gscratch/comdata/output/reddit_ngrams/comment_authors.parquet ${similarity_data}/subreddits_by_num_comments_nonsfw.csv
|
||||
# mkdir -p ${tfidf_data}/
|
||||
start_spark_and_run.sh 3 tfidf.py authors --topN=100000 --inpath=$< --outpath=${tfidf_data}/comment_authors_100k.parquet
|
||||
|
||||
${tfidf_data}/comment_authors_10k.parquet: /gscratch/comdata/output/reddit_ngrams/comment_authors.parquet ${similarity_data}/subreddits_by_num_comments_nonsfw.csv
|
||||
# mkdir -p ${tfidf_data}/
|
||||
start_spark_and_run.sh 3 tfidf.py authors --topN=10000 --inpath=$< --outpath=${tfidf_data}/comment_authors_10k.parquet
|
||||
|
||||
${tfidf_data}/comment_authors_30k.parquet: /gscratch/comdata/output/reddit_ngrams/comment_authors.parquet ${similarity_data}/subreddits_by_num_comments_nonsfw.csv
|
||||
# mkdir -p ${tfidf_data}/
|
||||
start_spark_and_run.sh 3 tfidf.py authors --topN=30000 --inpath=$< --outpath=${tfidf_data}/comment_authors_30k.parquet
|
||||
|
||||
${tfidf_data}/tfidf_weekly/comment_terms_100k.parquet: /gscratch/comdata/output/reddit_ngrams/comment_terms.parquet ${similarity_data}/subreddits_by_num_comments_nonsfw.csv
|
||||
start_spark_and_run.sh 3 tfidf.py terms_weekly --topN=100000 --outpath=${similarity_data}/tfidf_weekly/comment_authors_100k.parquet
|
||||
|
||||
${tfidf_data}/tfidf_weekly/comment_authors_100k.parquet: /gscratch/comdata/output/reddit_ngrams/comment_terms.parquet ${similarity_data}/subreddits_by_ppnum_comments.csv
|
||||
start_spark_and_run.sh 3 tfidf.py authors_weekly --topN=100000 --inpath=$< --outpath=${tfidf_weekly_data}/comment_authors_100k.parquet
|
||||
|
||||
${tfidf_weekly_data}/comment_terms_30k.parquet: /gscratch/comdata/output/reddit_ngrams/comment_terms.parquet ${similarity_data}/subreddits_by_num_comments_nonsfw.csv
|
||||
start_spark_and_run.sh 2 tfidf.py terms_weekly --topN=30000 --inpath=$< --outpath=${tfidf_weekly_data}/comment_authors_30k.parquet
|
||||
|
||||
${tfidf_weekly_data}/comment_authors_30k.parquet: /gscratch/comdata/output/reddit_ngrams/comment_terms.parquet ${similarity_data}/subreddits_by_num_comments_nonsfw.csv
|
||||
start_spark_and_run.sh 3 tfidf.py authors_weekly --topN=30000 --inpath=$< --outpath=${tfidf_weekly_data}/comment_authors_30k.parquet
|
||||
|
||||
${similarity_weekly_data}/comment_terms_100k.parquet: weekly_cosine_similarities.py similarities_helper.py ${tfidf_weekly_data}/comment_terms_100k.parquet
|
||||
${srun} python3 weekly_cosine_similarities.py terms --topN=100000 --outfile=${similarity_weekly_data}/comment_terms_100k.parquet
|
||||
|
||||
${similarity_weekly_data}/comment_authors_100k.parquet: weekly_cosine_similarities.py similarities_helper.py /gscratch/comdata/output/reddit_ngrams/comment_terms.parquet ${similarity_data}/subreddits_by_num_comments_nonsfw.csv ${tfidf_weekly_data}/comment_authors_100k.parquet
|
||||
${srun} python3 weekly_cosine_similarities.py authors --topN=100000 --outfile=${similarity_weekly_data}/comment_authors_100k.parquet
|
||||
|
||||
${similarity_weekly_data}/comment_terms_30k.parquet: weekly_cosine_similarities.py similarities_helper.py /gscratch/comdata/output/reddit_ngrams/comment_terms.parquet ${similarity_data}/subreddits_by_num_comments_nonsfw.csv ${tfidf_weekly_data}/comment_terms_30k.parquet
|
||||
${srun} python3 weekly_cosine_similarities.py terms --topN=30000 --outfile=${similarity_weekly_data}/comment_authors_30k.parquet
|
||||
|
||||
,${similarity_weekly_data}/comment_authors_30k.parquet: weekly_cosine_similarities.py similarities_helper.py /gscratch/comdata/output/reddit_ngrams/comment_terms.parquet ${similarity_data}/subreddits_by_num_comments_nonsfw.csv ${tfidf_weekly_data}/comment_authors_30k.parquet
|
||||
${srun} python3 weekly_cosine_similarities.py authors --topN=30000 --outfile=${similarity_weekly_data}/comment_authors_30k.parquet
|
||||
|
||||
# ${tfidf_weekly_data}/comment_authors_130k.parquet: tfidf.py similarities_helper.py /gscratch/comdata/output/reddit_ngrams/comment_authors.parquet /gscratch/comdata/output/reddit_similarity/subreddits_by_num_comments_nonsfw.csv
|
||||
# start_spark_and_run.sh 1 tfidf.py authors_weekly --topN=130000
|
||||
|
||||
# /gscratch/comdata/output/reddit_similarity/comment_authors_10000.parquet: cosine_similarities.py similarities_helper.py /gscratch/comdata/output/reddit_similarity/tfidf/comment_authors.parquet /gscratch/comdata/output/reddit_similarity/tfidf/comment_authors.parquet
|
||||
# start_spark_and_run.sh 1 cosine_similarities.py author --outfile=/gscratch/comdata/output/reddit_similarity/comment_authors_10000.feather
|
||||
|
||||
# /gscratch/comdata/output/reddit_similarity/comment_terms.parquet: cosine_similarities.py similarities_helper.py /gscratch/comdata/output/reddit_similarity/tfidf/comment_terms.parquet
|
||||
# start_spark_and_run.sh 1 cosine_similarities.py term --outfile=/gscratch/comdata/output/reddit_similarity/comment_terms_10000.feather
|
||||
|
||||
# /gscratch/comdata/output/reddit_similarity/comment_terms_10000_weekly.parquet: cosine_similarities.py ${tfidf_weekly_data}/comment_authors.parquet
|
||||
# start_spark_and_run.sh 1 weekly_cosine_similarities.py term --outfile=/gscratch/comdata/output/reddit_similarity/subreddit_comment_terms_10000_weely.parquet
|
||||
|
||||
# /gscratch/comdata/output/reddit_similarity/subreddit_author_tf_similarities_10000.parquet: cosine_similarities.py similarities_helper.py /gscratch/comdata/output/reddit_similarity/tfidf/comment_authors.parquet /gscratch/comdata/output/reddit_similarity/tfidf/comment_authors.parquet
|
||||
# start_spark_and_run.sh 1 cosine_similarities.py author-tf --outfile=/gscratch/comdata/output/reddit_similarity/subreddit_author_tf_similarities_10000.parquet
|
||||
../../data/reddit_comments_by_subreddit.parquet:
|
||||
$(MAKE) -C ../datasets
|
||||
|
||||
Binary file not shown.
@@ -1,4 +1,6 @@
|
||||
#!/usr/bin/bash
|
||||
source ~/.bashrc
|
||||
echo $(hostname)
|
||||
start_spark_cluster.sh
|
||||
singularity exec /gscratch/comdata/users/nathante/containers/nathante.sif spark-submit --master spark://$(hostname):7077 tfidf.py authors --topN=100000 --inpath=/gscratch/comdata/output/reddit_ngrams/comment_authors.parquet --outpath=/gscratch/scrubbed/comdata/reddit_similarity/tfidf/comment_authors_100k.parquet
|
||||
singularity exec /gscratch/comdata/users/nathante/containers/nathante.sif stop-all.sh
|
||||
spark-submit --verbose --master spark://$(hostname):43015 tfidf.py authors --topN=100000 --inpath=../../data/reddit_ngrams/comment_authors_sorted.parquet --outpath=../../data/reddit_similarity/tfidf/comment_authors_100k.parquet
|
||||
stop-all.sh
|
||||
|
||||
@@ -43,7 +43,7 @@ def reindex_tfidf(*args, **kwargs):
|
||||
new_ids = df.loc[:,['subreddit_id','subreddit_id_new']].drop_duplicates()
|
||||
new_ids = new_ids.set_index('subreddit_id')
|
||||
subreddit_names = subreddit_names.join(new_ids,on='subreddit_id').reset_index()
|
||||
subreddit_names = subreddit_names.drop("subreddit_id",1)
|
||||
subreddit_names = subreddit_names.drop("subreddit_id",axis=1)
|
||||
subreddit_names = subreddit_names.sort_values("subreddit_id_new")
|
||||
return(df, subreddit_names)
|
||||
|
||||
@@ -51,8 +51,9 @@ def pull_tfidf(*args, **kwargs):
|
||||
df, _, _ = _pull_or_reindex_tfidf(*args, **kwargs, reindex=False)
|
||||
return df
|
||||
|
||||
def _pull_or_reindex_tfidf(infile, term_colname, min_df=None, max_df=None, included_subreddits=None, topN=500, week=None, from_date=None, to_date=None, rescale_idf=True, tf_family=tf_weight.MaxTF, reindex=True):
|
||||
print(f"loading tfidf {infile}", flush=True)
|
||||
def _pull_or_reindex_tfidf(infile, term_colname, min_df=None, max_df=None, included_subreddits=None, topN=None, week=None, from_date=None, to_date=None, rescale_idf=True, tf_family=tf_weight.MaxTF, reindex=True):
|
||||
print(f"loading tfidf {infile}, week {week}, min_df {min_df}, max_df {max_df}", flush=True)
|
||||
|
||||
if week is not None:
|
||||
tfidf_ds = ds.dataset(infile, partitioning='hive')
|
||||
else:
|
||||
@@ -97,20 +98,21 @@ def _pull_or_reindex_tfidf(infile, term_colname, min_df=None, max_df=None, inclu
|
||||
'relative_tf':ds.field('relative_tf').cast('float32'),
|
||||
'tf_idf':ds.field('tf_idf').cast('float32')}
|
||||
|
||||
print(projection)
|
||||
|
||||
print(projection, flush=True)
|
||||
print(ds_filter, flush=True)
|
||||
df = tfidf_ds.to_table(filter=ds_filter,columns=projection)
|
||||
|
||||
df = df.to_pandas(split_blocks=True,self_destruct=True)
|
||||
print("assigning indexes",flush=True)
|
||||
if reindex:
|
||||
df['subreddit_id_new'] = df.groupby("subreddit_id").ngroup()
|
||||
print("assigning indexes",flush=True)
|
||||
df['subreddit_id_new'] = df.groupby("subreddit_id").ngroup() + 1
|
||||
else:
|
||||
df['subreddit_id_new'] = df['subreddit_id']
|
||||
|
||||
if reindex:
|
||||
grouped = df.groupby(term_id)
|
||||
df[term_id_new] = grouped.ngroup()
|
||||
df[term_id_new] = grouped.ngroup() + 1
|
||||
else:
|
||||
df[term_id_new] = df[term_id]
|
||||
|
||||
@@ -126,17 +128,6 @@ def _pull_or_reindex_tfidf(infile, term_colname, min_df=None, max_df=None, inclu
|
||||
|
||||
return (df, tfidf_ds, ds_filter)
|
||||
|
||||
with Pool(cpu_count()) as pool:
|
||||
chunks = pool.imap_unordered(pull_names,batches)
|
||||
subreddit_names = pd.concat(chunks,copy=False).drop_duplicates()
|
||||
|
||||
subreddit_names = subreddit_names.set_index("subreddit_id")
|
||||
new_ids = df.loc[:,['subreddit_id','subreddit_id_new']].drop_duplicates()
|
||||
new_ids = new_ids.set_index('subreddit_id')
|
||||
subreddit_names = subreddit_names.join(new_ids,on='subreddit_id').reset_index()
|
||||
subreddit_names = subreddit_names.drop("subreddit_id",1)
|
||||
subreddit_names = subreddit_names.sort_values("subreddit_id_new")
|
||||
return(df, subreddit_names)
|
||||
|
||||
def pull_names(batch):
|
||||
return(batch.to_pandas().drop_duplicates())
|
||||
@@ -170,7 +161,7 @@ def similarities(inpath, simfunc, term_colname, outfile, min_df=None, max_df=Non
|
||||
term_id_new = term + '_id_new'
|
||||
|
||||
entries, subreddit_names = reindex_tfidf(inpath, term_colname=term_colname, min_df=min_df, max_df=max_df, included_subreddits=included_subreddits, topN=topN,from_date=from_date,to_date=to_date)
|
||||
mat = csr_matrix((entries[tfidf_colname],(entries[term_id_new], entries.subreddit_id_new)))
|
||||
mat = csr_matrix((entries[tfidf_colname],(entries[term_id_new]-1, entries.subreddit_id_new-1)))
|
||||
|
||||
print("loading matrix")
|
||||
|
||||
@@ -256,22 +247,20 @@ def lsi_column_similarities(tfidfmat,n_components=300,n_iter=10,random_state=196
|
||||
|
||||
else:
|
||||
print("running LSI",flush=True)
|
||||
|
||||
svd = TruncatedSVD(n_components=svd_components,random_state=random_state,algorithm=algorithm,n_iter=n_iter)
|
||||
mod = svd.fit(tfidfmat.T)
|
||||
|
||||
lsimat = mod.transform(tfidfmat.T)
|
||||
if lsi_model_save is not None:
|
||||
Path(lsi_model_save).parent.mkdir(exist_ok=True, parents=True)
|
||||
pickle.dump(mod, open(lsi_model_save,'wb'))
|
||||
|
||||
sims_list = []
|
||||
print(n_components, flush=True)
|
||||
lsimat = mod.transform(tfidfmat.T)
|
||||
for n_dims in n_components:
|
||||
print("computing similarities", flush=True)
|
||||
sims = column_similarities(lsimat[:,np.arange(n_dims)])
|
||||
if len(n_components) > 1:
|
||||
yield (sims, n_dims)
|
||||
else:
|
||||
return sims
|
||||
yield (sims, n_dims)
|
||||
|
||||
|
||||
|
||||
def column_similarities(mat):
|
||||
@@ -327,11 +316,11 @@ def build_weekly_tfidf_dataset(df, include_subs, term_colname, tf_family=tf_weig
|
||||
else: # tf_fam = tf_weight.Norm05
|
||||
df = df.withColumn("tf_idf", (0.5 + 0.5 * df.relative_tf) * df.idf)
|
||||
|
||||
df = df.repartition(400,'subreddit','week')
|
||||
df = df.repartition('week')
|
||||
dfwriter = df.write.partitionBy("week")
|
||||
return dfwriter
|
||||
|
||||
def _calc_tfidf(df, term_colname, tf_family):
|
||||
def _calc_tfidf(df, term_colname, tf_family, min_df=None, max_df=None):
|
||||
term = term_colname
|
||||
term_id = term + '_id'
|
||||
|
||||
@@ -349,7 +338,13 @@ def _calc_tfidf(df, term_colname, tf_family):
|
||||
idf = idf.withColumn('idf',f.log(N_docs/(1+f.col('count')))+1)
|
||||
|
||||
# collect the dictionary to make a pydict of terms to indexes
|
||||
terms = idf.select(term).distinct() # terms are distinct
|
||||
terms = idf
|
||||
if min_df is not None:
|
||||
terms = terms.filter(f.col('count')>=min_df)
|
||||
if max_df is not None:
|
||||
terms = terms.filter(f.col('count')<=max_df)
|
||||
|
||||
terms = terms.select(term).distinct() # terms are distinct
|
||||
terms = terms.withColumn(term_id,f.row_number().over(Window.orderBy(term))) # term ids are distinct
|
||||
|
||||
# make subreddit ids
|
||||
@@ -359,12 +354,12 @@ def _calc_tfidf(df, term_colname, tf_family):
|
||||
df = df.join(subreddits,on='subreddit')
|
||||
|
||||
# map terms to indexes in the tfs and the idfs
|
||||
df = df.join(terms,on=term) # subreddit-term-id is unique
|
||||
df = df.join(terms,on=term,how='inner') # subreddit-term-id is unique
|
||||
|
||||
idf = idf.join(terms,on=term)
|
||||
idf = idf.join(terms,on=term,how='inner')
|
||||
|
||||
# join on subreddit/term to create tf/dfs indexed by term
|
||||
df = df.join(idf, on=[term_id, term])
|
||||
df = df.join(idf, on=[term_id, term],how='inner')
|
||||
|
||||
# agg terms by subreddit to make sparse tf/df vectors
|
||||
if tf_family == tf_weight.MaxTF:
|
||||
@@ -375,19 +370,19 @@ def _calc_tfidf(df, term_colname, tf_family):
|
||||
return df
|
||||
|
||||
|
||||
def tfidf_dataset(df, include_subs, term_colname, tf_family=tf_weight.Norm05):
|
||||
def tfidf_dataset(df, include_subs, term_colname, tf_family=tf_weight.Norm05, min_df=None, max_df=None):
|
||||
term = term_colname
|
||||
term_id = term + '_id'
|
||||
# aggregate counts by week. now subreddit-term is distinct
|
||||
df = df.filter(df.subreddit.isin(include_subs))
|
||||
df = df.groupBy(['subreddit',term]).agg(f.sum('tf').alias('tf'))
|
||||
|
||||
df = _calc_tfidf(df, term_colname, tf_family)
|
||||
df = _calc_tfidf(df, term_colname, tf_family, min_df, max_df)
|
||||
df = df.repartition('subreddit')
|
||||
dfwriter = df.write
|
||||
return dfwriter
|
||||
|
||||
def select_topN_subreddits(topN, path="/gscratch/comdata/output/reddit_similarity/subreddits_by_num_comments_nonsfw.csv"):
|
||||
def select_topN_subreddits(topN, path="../../data/reddit_similarity/subreddits_by_num_comments_nonsfw.csv"):
|
||||
rankdf = pd.read_csv(path)
|
||||
included_subreddits = set(rankdf.loc[rankdf.comments_rank <= topN,'subreddit'].values)
|
||||
return included_subreddits
|
||||
|
||||
@@ -1,16 +1,20 @@
|
||||
from pyspark.sql import functions as f
|
||||
from pyspark.sql import SparkSession
|
||||
from pyspark.sql import Window
|
||||
from datetime import datetime
|
||||
from pathlib import Path
|
||||
|
||||
spark = SparkSession.builder.getOrCreate()
|
||||
conf = spark.sparkContext.getConf()
|
||||
|
||||
submissions = spark.read.parquet("/gscratch/comdata/output/reddit_submissions_by_subreddit.parquet")
|
||||
submissions = spark.read.parquet("../../data/reddit_submissions_by_subreddit.parquet")
|
||||
|
||||
submissions = submissions.filter(f.col("CreatedAt") <= datetime(2020,4,13))
|
||||
|
||||
prop_nsfw = submissions.select(['subreddit','over_18']).groupby('subreddit').agg(f.mean(f.col('over_18').astype('double')).alias('prop_nsfw'))
|
||||
|
||||
df = spark.read.parquet("/gscratch/comdata/output/reddit_comments_by_subreddit.parquet")
|
||||
|
||||
df = spark.read.parquet("../../data/reddit_comments_by_subreddit.parquet")
|
||||
df = df.filter(f.col("CreatedAt") <= datetime(2020,4,13))
|
||||
# remove /u/ pages
|
||||
df = df.filter(~df.subreddit.like("u_%"))
|
||||
|
||||
@@ -26,4 +30,6 @@ df = df.toPandas()
|
||||
|
||||
df = df.sort_values("n_comments")
|
||||
|
||||
df.to_csv('/gscratch/scrubbed/comdata/reddit_similarity/subreddits_by_num_comments_nonsfw.csv', index=False)
|
||||
outpath = Path("../../data/reddit_similarity/subreddits_by_num_comments_nonsfw.csv")
|
||||
outpath.parent.mkdir(exist_ok=True, parents=True)
|
||||
df.to_csv(str(outpath), index=False)
|
||||
|
||||
@@ -1,18 +0,0 @@
|
||||
from similarities_helper import similarities
|
||||
import numpy as np
|
||||
import fire
|
||||
|
||||
def wang_similarity(mat):
|
||||
non_zeros = (mat != 0).astype(np.float32)
|
||||
intersection = non_zeros.T @ non_zeros
|
||||
return intersection
|
||||
|
||||
|
||||
infile="/gscratch/comdata/output/reddit_similarity/tfidf/comment_authors.parquet"; outfile="/gscratch/comdata/output/reddit_similarity/wang_similarity_10000.feather"; min_df=1; included_subreddits=None; topN=10000; exclude_phrases=False; from_date=None; to_date=None
|
||||
|
||||
def wang_overlaps(infile, outfile="/gscratch/comdata/output/reddit_similarity/wang_similarity_10000.feather", min_df=1, max_df=None, included_subreddits=None, topN=10000, exclude_phrases=False, from_date=None, to_date=None):
|
||||
|
||||
return similarities(infile=infile, simfunc=wang_similarity, term_colname='author', outfile=outfile, min_df=min_df, max_df=max_df, included_subreddits=included_subreddits, topN=topN, exclude_phrases=exclude_phrases, from_date=from_date, to_date=to_date)
|
||||
|
||||
if __name__ == "__main__":
|
||||
fire.Fire(wang_overlaps)
|
||||
@@ -1,149 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
from pyspark.sql import functions as f
|
||||
from pyspark.sql import SparkSession
|
||||
from pyspark.sql import Window
|
||||
import numpy as np
|
||||
import pyarrow
|
||||
import pyarrow.dataset as ds
|
||||
import pandas as pd
|
||||
import fire
|
||||
from itertools import islice, chain
|
||||
from pathlib import Path
|
||||
from similarities_helper import pull_tfidf, column_similarities, write_weekly_similarities, lsi_column_similarities
|
||||
from scipy.sparse import csr_matrix
|
||||
from multiprocessing import Pool, cpu_count
|
||||
from functools import partial
|
||||
import pickle
|
||||
|
||||
# tfidf_path = "/gscratch/comdata/users/nathante/competitive_exclusion_reddit/data/similarity_weekly/comment_authors_tfidf.parquet"
|
||||
# #tfidf_path = "/gscratch/comdata/users/nathante/competitive_exclusion_reddit/data//comment_authors_compex.parquet"
|
||||
# min_df=2
|
||||
# included_subreddits="/gscratch/comdata/users/nathante/competitive_exclusion_reddit/data/included_subreddits.txt"
|
||||
# max_df = None
|
||||
# topN=100
|
||||
# term_colname='author'
|
||||
# # outfile = '/gscratch/comdata/output/reddit_similarity/weekly/comment_authors_test.parquet'
|
||||
# # included_subreddits=None
|
||||
outfile="/gscratch/comdata/users/nathante/competitive_exclusion_reddit/data/similarity_weekly/comment_authors.parquet"; infile="/gscratch/comdata/users/nathante/competitive_exclusion_reddit/data/tfidf_weekly/comment_authors_tfidf.parquet"; included_subreddits="/gscratch/comdata/users/nathante/competitive_exclusion_reddit/data/included_subreddits.txt"; lsi_model="/gscratch/comdata/users/nathante/competitive_exclusion_reddit/data/similarity/comment_authors_compex_LSI/2000_authors_LSIMOD.pkl"; n_components=1500; algorithm="randomized"; term_colname='author'; tfidf_path=infile; random_state=1968;
|
||||
|
||||
# static_tfidf = "/gscratch/comdata/users/nathante/competitive_exclusion_reddit/data/tfidf/comment_authors_compex.parquet"
|
||||
# dftest = spark.read.parquet(static_tfidf)
|
||||
|
||||
def _week_similarities(week, simfunc, tfidf_path, term_colname, included_subreddits, outdir:Path, subreddit_names, nterms, topN=None, min_df=None, max_df=None):
|
||||
term = term_colname
|
||||
term_id = term + '_id'
|
||||
term_id_new = term + '_id_new'
|
||||
print(f"loading matrix: {week}")
|
||||
|
||||
entries = pull_tfidf(infile = tfidf_path,
|
||||
term_colname=term_colname,
|
||||
included_subreddits=included_subreddits,
|
||||
topN=topN,
|
||||
week=week.isoformat(),
|
||||
rescale_idf=False)
|
||||
|
||||
tfidf_colname='tf_idf'
|
||||
# if the max subreddit id we found is less than the number of subreddit names then we have to fill in 0s
|
||||
mat = csr_matrix((entries[tfidf_colname],(entries[term_id_new]-1, entries.subreddit_id_new-1)),shape=(nterms,subreddit_names.shape[0]))
|
||||
print('computing similarities')
|
||||
print(simfunc)
|
||||
sims = simfunc(mat)
|
||||
del mat
|
||||
sims = next(sims)[0]
|
||||
sims = pd.DataFrame(sims)
|
||||
sims = sims.rename({i: sr for i, sr in enumerate(subreddit_names.subreddit.values)}, axis=1)
|
||||
sims['_subreddit'] = subreddit_names.subreddit.values
|
||||
outfile = str(Path(outdir) / str(week))
|
||||
write_weekly_similarities(outfile, sims, week, subreddit_names)
|
||||
|
||||
def pull_weeks(batch):
|
||||
return set(batch.to_pandas()['week'])
|
||||
|
||||
# This requires a prefit LSI model, since we shouldn't fit different LSI models for every week.
|
||||
def cosine_similarities_weekly_lsi(*args, n_components=100, lsi_model=None, **kwargs):
|
||||
print(args)
|
||||
print(kwargs)
|
||||
term_colname= kwargs.get('term_colname')
|
||||
# lsi_model = "/gscratch/comdata/users/nathante/competitive_exclusion_reddit/data/similarity/comment_authors_compex_LSI/1000_author_LSIMOD.pkl"
|
||||
|
||||
lsi_model = pickle.load(open(lsi_model,'rb'))
|
||||
#simfunc = partial(lsi_column_similarities,n_components=n_components,random_state=random_state,algorithm='randomized',lsi_model=lsi_model)
|
||||
simfunc = partial(lsi_column_similarities,n_components=n_components,random_state=kwargs.get('random_state'),lsi_model=lsi_model)
|
||||
|
||||
return cosine_similarities_weekly(*args, simfunc=simfunc, **kwargs)
|
||||
|
||||
#tfidf = spark.read.parquet('/gscratch/comdata/users/nathante/subreddit_tfidf_weekly.parquet')
|
||||
def cosine_similarities_weekly(tfidf_path, outfile, term_colname, included_subreddits = None, topN = None, simfunc=column_similarities, min_df=None,max_df=None):
|
||||
print(outfile)
|
||||
# do this step in parallel if we have the memory for it.
|
||||
# should be doable with pool.map
|
||||
|
||||
spark = SparkSession.builder.getOrCreate()
|
||||
df = spark.read.parquet(tfidf_path)
|
||||
|
||||
# load subreddits + topN
|
||||
|
||||
subreddit_names = df.select(['subreddit','subreddit_id']).distinct().toPandas()
|
||||
subreddit_names = subreddit_names.sort_values("subreddit_id")
|
||||
nterms = df.select(f.max(f.col(term_colname + "_id")).alias('max')).collect()[0].max
|
||||
weeks = df.select(f.col("week")).distinct().toPandas().week.values
|
||||
spark.stop()
|
||||
|
||||
print(f"computing weekly similarities")
|
||||
week_similarities_helper = partial(_week_similarities,simfunc=simfunc, tfidf_path=tfidf_path, term_colname=term_colname, outdir=outfile, min_df=min_df, max_df=max_df, included_subreddits=included_subreddits, topN=None, subreddit_names=subreddit_names,nterms=nterms)
|
||||
|
||||
for week in weeks:
|
||||
week_similarities_helper(week)
|
||||
# pool = Pool(cpu_count())
|
||||
|
||||
# list(pool.imap(week_similarities_helper, weeks))
|
||||
# pool.close()
|
||||
# with Pool(cpu_count()) as pool: # maybe it can be done with 40 cores on the huge machine?
|
||||
|
||||
|
||||
def author_cosine_similarities_weekly(outfile, infile='/gscratch/comdata/output/reddit_similarity/tfidf_weekly/comment_authors_test.parquet', min_df=2, max_df=None, included_subreddits=None, topN=500):
|
||||
return cosine_similarities_weekly(infile,
|
||||
outfile,
|
||||
'author',
|
||||
max_df,
|
||||
included_subreddits,
|
||||
topN,
|
||||
min_df=2
|
||||
)
|
||||
|
||||
def term_cosine_similarities_weekly(outfile, infile='/gscratch/comdata/output/reddit_similarity/tfidf_weekly/comment_terms.parquet', min_df=None, max_df=None, included_subreddits=None, topN=None):
|
||||
return cosine_similarities_weekly(infile,
|
||||
outfile,
|
||||
'term',
|
||||
min_df,
|
||||
max_df,
|
||||
included_subreddits,
|
||||
topN)
|
||||
|
||||
|
||||
def author_cosine_similarities_weekly_lsi(outfile, infile = '/gscratch/comdata/output/reddit_similarity/tfidf_weekly/comment_authors_test.parquet', included_subreddits=None, n_components=100,lsi_model=None):
|
||||
return cosine_similarities_weekly_lsi(infile,
|
||||
outfile,
|
||||
'author',
|
||||
included_subreddits=included_subreddits,
|
||||
n_components=n_components,
|
||||
lsi_model=lsi_model
|
||||
)
|
||||
|
||||
|
||||
def term_cosine_similarities_weekly_lsi(outfile, infile = '/gscratch/comdata/output/reddit_similarity/tfidf_weekly/comment_terms.parquet', included_subreddits=None, n_components=100,lsi_model=None):
|
||||
return cosine_similarities_weekly_lsi(infile,
|
||||
outfile,
|
||||
'term',
|
||||
included_subreddits=included_subreddits,
|
||||
n_components=n_components,
|
||||
lsi_model=lsi_model,
|
||||
)
|
||||
|
||||
if __name__ == "__main__":
|
||||
fire.Fire({'authors':author_cosine_similarities_weekly,
|
||||
'terms':term_cosine_similarities_weekly,
|
||||
'authors-lsi':author_cosine_similarities_weekly_lsi,
|
||||
'terms-lsi':term_cosine_similarities_weekly_lsi
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user