From 3719cdcb634bd9bb2c19a5780fd6a6f38db7b37e Mon Sep 17 00:00:00 2001 From: db29 Date: Tue, 6 Jul 2021 23:23:51 +0300 Subject: [PATCH 01/12] Used some linter --- README.md | 47 +++++++++++++++++++++++++---------------------- 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 6ac434fc71..5ec6cf743d 100644 --- a/README.md +++ b/README.md @@ -1,47 +1,50 @@ # ILNewsDiff -See feed here: https://twitter.com/ILNewsDiff +See feed here: **Interested in contributing to this project? Send us a direct message on [twitter](https://twitter.com/ILNewsDiff)** A Twitter bot that keeps track of changes made in Israeli news websites. Currently tracking: - * [Haaretz](https://www.haaretz.co.il/) - * [Israel Hayom](https://Israelhayom.co.il/) - * [Walla](https://www.walla.co.il/) - -How does it work? ------------- + +* [Haaretz](https://www.haaretz.co.il/) +* [Israel Hayom](https://Israelhayom.co.il/) +* [Walla](https://www.walla.co.il/) + +## How does it work? + Once a minute the code queries news feeds and compares them to a previous state saved in a local SQLite DB. If an _interesting_ change is found, a tweet is published with the diff. -The first tweet of a diff is always the article itself as a link, and all the subsequent changes are chained by order. +The first tweet of a diff is always the article itself as a link, and all the subsequent changes are chained by order. ### What is _interesting_? + A change that - * Has happened and is not there because of a delay in the RSS feed. The code queries the article's page to look for the change. - * Is not comprised of only whitespace or punctuation. - * Has a difference of more than one letter (Though adding/removing a question mark '?' is interesting) - -Installation ------------- -+ The [phantomjs](http://phantomjs.org/) binary needs to be installed, and the path updated in the run_diff.sh file. -+ `pip install -r requirements.txt` +* Has happened and is not there because of a delay in the RSS feed. The code queries the article's page to look for the change. +* Is not comprised of only whitespace or punctuation. +* Has a difference of more than one letter (Though adding/removing a question mark '?' is interesting) + +## Installation + +* The [phantomjs](http://phantomjs.org/) binary needs to be installed, and the path updated in the run_diff.sh file. +* `pip install -r requirements.txt` [Twitter keys](https://dev.twitter.com/) are needed. -Credits -------- +## Credits + For contributing to this repo: + * [@yuvalpinter](https://github.com/yuvalpinter) Based on @j-e-d's code for the Twitter bot [@nyt_diff](https://twitter.com/nyt_diff). RSS feed fetching added for @xuv's Twitter bot [@lesoir_diff](https://twitter.com/lesoir_diff) -+ Original script and idea: @j-e-d Juan E.D. http://unahormiga.com/ -+ RSS fetching: @xuv Julien Deswaef http://xuv.be -+ Font: [Merriweather](https://fonts.google.com/specimen/Merriweather) -+ Background pattern: [Paper Fibers](http://subtlepatterns.com/paper-fibers/). +* Original script and idea: @j-e-d Juan E.D. +* RSS fetching: @xuv Julien Deswaef +* Font: [Merriweather](https://fonts.google.com/specimen/Merriweather) +* Background pattern: [Paper Fibers](http://subtlepatterns.com/paper-fibers/). From 820ae2460b9175b305753b5e90e95fdf20c23640 Mon Sep 17 00:00:00 2001 From: db29 Date: Tue, 6 Jul 2021 23:25:18 +0300 Subject: [PATCH 02/12] Remove the second gitignore --- output/.gitignore | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 output/.gitignore diff --git a/output/.gitignore b/output/.gitignore deleted file mode 100644 index e69de29bb2..0000000000 From 68472589669c00fc6c77c1c90d7cdd451d74d2f8 Mon Sep 17 00:00:00 2001 From: db29 Date: Tue, 6 Jul 2021 23:26:13 +0300 Subject: [PATCH 03/12] Moved logging into a file --- loggers.py | 27 +++++++++++++++++++++++++++ main.py | 46 ++++++++++------------------------------------ 2 files changed, 37 insertions(+), 36 deletions(-) create mode 100644 loggers.py diff --git a/loggers.py b/loggers.py new file mode 100644 index 0000000000..aea9f42ec3 --- /dev/null +++ b/loggers.py @@ -0,0 +1,27 @@ +import logging +import os +import sys + +if 'LOG_FOLDER' in os.environ: + LOG_FOLDER = os.environ['LOG_FOLDER'] +else: + LOG_FOLDER = '' + + +def setup_loggers(): + # Add Handlers + logging_filehandler = logging.FileHandler(filename=os.path.join(LOG_FOLDER, 'titlediff.log'), encoding='utf-8', mode='a+') + handlers = [logging_filehandler, logging.StreamHandler(sys.stdout)] + logging.basicConfig(handlers=handlers, + format='%(asctime)s %(name)13s %(levelname)8s: %(message)s', + level=logging.DEBUG) + + # Handle some loggers + logging.getLogger("requests").setLevel(logging.WARNING) + logging.getLogger("selenium").setLevel(logging.WARNING) + logging.getLogger("PIL").setLevel(logging.WARNING) + logging.getLogger("requests_oauthlib").setLevel(logging.WARNING) + logging.getLogger("chardet").setLevel(logging.WARNING) + logging.getLogger("tweepy").setLevel(logging.WARNING) + logging.getLogger("oauthlib").setLevel(logging.WARNING) + logging.getLogger("urllib3").setLevel(logging.WARNING) diff --git a/main.py b/main.py index 19dddebc1a..a7e254678d 100644 --- a/main.py +++ b/main.py @@ -1,55 +1,29 @@ #!/usr/bin/python3 import logging -import os -import sys - from pytz import timezone from parsers.haaretz_parser import HaaretzParser from parsers.israel_hayom_parser import IsraelHayomParser from parsers.walla_parser import WallaParser +from loggers import setup_loggers TIMEZONE = 'Israel' LOCAL_TZ = timezone(TIMEZONE) - -if 'LOG_FOLDER' in os.environ: - LOG_FOLDER = os.environ['LOG_FOLDER'] -else: - LOG_FOLDER = '' +PARSER_CLASSES = [HaaretzParser, IsraelHayomParser, WallaParser] def main(): - # logging - logging_filehandler = logging.FileHandler(filename=LOG_FOLDER + 'titlediff.log', - encoding='utf-8', mode='a+') - handlers = [logging_filehandler, logging.StreamHandler(sys.stdout)] - logging.basicConfig(handlers=handlers, - format='%(asctime)s %(name)13s %(levelname)8s: %(message)s', - level=logging.DEBUG) - - logging.getLogger("requests").setLevel(logging.WARNING) - logging.getLogger("selenium").setLevel(logging.WARNING) - logging.getLogger("PIL").setLevel(logging.WARNING) - logging.getLogger("requests_oauthlib").setLevel(logging.WARNING) - logging.getLogger("chardet").setLevel(logging.WARNING) - logging.getLogger("tweepy").setLevel(logging.WARNING) - logging.getLogger("oauthlib").setLevel(logging.WARNING) - logging.getLogger("urllib3").setLevel(logging.WARNING) - + setup_loggers() logging.info('Starting script') - try: - logging.debug('Starting Parsers') - parsers = [HaaretzParser(LOCAL_TZ), IsraelHayomParser(LOCAL_TZ), WallaParser(LOCAL_TZ)] - for parser in parsers: - logging.info(f"Parsing {parser.get_source()}") - parser.parse() - logging.debug('Finished') - except Exception: - logging.exception('Parser') - - logging.info('Finished script') + logging.debug('Starting Parsers') + parsers = [parser_class(LOCAL_TZ) for parser_class in PARSER_CLASSES] + for parser in parsers: + logging.info(f"Parsing {parser.get_source()}") + parser.parse() + + logging.debug('Finished') if __name__ == "__main__": From d2d95f9f26640a67a03d17764c37df415eec1999 Mon Sep 17 00:00:00 2001 From: db29 Date: Tue, 6 Jul 2021 23:29:13 +0300 Subject: [PATCH 04/12] Moved parsers to the folder togther --- base_parser.py => parsers/base_parser.py | 1 + rss_parser.py => parsers/rss_parser.py | 5 ++--- 2 files changed, 3 insertions(+), 3 deletions(-) rename base_parser.py => parsers/base_parser.py (99%) rename rss_parser.py => parsers/rss_parser.py (84%) diff --git a/base_parser.py b/parsers/base_parser.py similarity index 99% rename from base_parser.py rename to parsers/base_parser.py index 15284b9d8f..30f0dc10ce 100644 --- a/base_parser.py +++ b/parsers/base_parser.py @@ -121,6 +121,7 @@ def loop_entries(self, entries): articles[article_dict['article_id']] = article_dict except BaseException: logging.exception(f'Problem looping entry: {article}') + for article_dict in articles.values(): try: self.store_data(article_dict) diff --git a/rss_parser.py b/parsers/rss_parser.py similarity index 84% rename from rss_parser.py rename to parsers/rss_parser.py index f473e844ef..eb3a7c156e 100644 --- a/rss_parser.py +++ b/parsers/rss_parser.py @@ -1,5 +1,4 @@ import logging - import feedparser from base_parser import BaseParser @@ -16,6 +15,6 @@ def parse(self): if r is None: logging.warning('Empty response RSS') return - else: - logging.info('Parsing %s', r.channel.title) + + logging.info('Parsing %s', r.channel.title) self.loop_entries(r.entries) From 34c3c448b72955859cb9cda7f750b349e0a44753 Mon Sep 17 00:00:00 2001 From: db29 Date: Fri, 9 Jul 2021 18:16:19 +0300 Subject: [PATCH 05/12] Move img genrating code into a folder togther --- .gitignore | 1 - {css => image_generator/css}/styles.css | 2 +- .../fonts}/Merriweather-Regular.ttf | Bin .../image_diff_generator.py | 6 ++---- template.html => image_generator/template.html | 0 img/paper_fibers.png | Bin 74094 -> 0 bytes img/twitter.png | Bin 32528 -> 0 bytes parsers/base_parser.py | 2 +- 8 files changed, 4 insertions(+), 7 deletions(-) rename {css => image_generator/css}/styles.css (92%) rename {fonts => image_generator/fonts}/Merriweather-Regular.ttf (100%) rename image_diff_generator.py => image_generator/image_diff_generator.py (95%) rename template.html => image_generator/template.html (100%) delete mode 100755 img/paper_fibers.png delete mode 100644 img/twitter.png diff --git a/.gitignore b/.gitignore index a56a5f2840..e02e100c17 100644 --- a/.gitignore +++ b/.gitignore @@ -189,5 +189,4 @@ dmypy.json *.log titles.db* -*.html *.png diff --git a/css/styles.css b/image_generator/css/styles.css similarity index 92% rename from css/styles.css rename to image_generator/css/styles.css index 90bb0f067e..b7db6c44be 100755 --- a/css/styles.css +++ b/image_generator/css/styles.css @@ -6,7 +6,7 @@ } body { - background: lightgray url('../img/paper_fibers.png') repeat; + background: lightgray url('../base_image/paper_fibers.png') repeat; font-family: Merriweather; font-size: 16px; direction: rtl; diff --git a/fonts/Merriweather-Regular.ttf b/image_generator/fonts/Merriweather-Regular.ttf similarity index 100% rename from fonts/Merriweather-Regular.ttf rename to image_generator/fonts/Merriweather-Regular.ttf diff --git a/image_diff_generator.py b/image_generator/image_diff_generator.py similarity index 95% rename from image_diff_generator.py rename to image_generator/image_diff_generator.py index baeb24b9cc..348c7f7022 100644 --- a/image_diff_generator.py +++ b/image_generator/image_diff_generator.py @@ -66,14 +66,12 @@ def generate_image_diff(old: str, new: str, text_to_tweet: str): img = Image.open('./tmp.png') img2 = img.crop((0, 0, total_width, total_height)) if int(total_width) > int(total_height * 2): - background = Image.new('RGBA', (total_width, int(total_width / 2)), - (255, 255, 255, 0)) + background = Image.new('RGBA', (total_width, int(total_width / 2)), (255, 255, 255, 0)) bg_w, bg_h = background.size offset = (int((bg_w - total_width) / 2), int((bg_h - total_height) / 2)) else: - background = Image.new('RGBA', (total_width, total_height), - (255, 255, 255, 0)) + background = Image.new('RGBA', (total_width, total_height), (255, 255, 255, 0)) bg_w, bg_h = background.size offset = (int((bg_w - total_width) / 2), int((bg_h - total_height) / 2)) diff --git a/template.html b/image_generator/template.html similarity index 100% rename from template.html rename to image_generator/template.html diff --git a/img/paper_fibers.png b/img/paper_fibers.png deleted file mode 100755 index 2d93493f8646fd3279956b3b3cc3685b57760793..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74094 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

fx+v^ig=k0m`5I_Z6rcEPCoiX%f*qsa7e&6k3S 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 RMIW^QTN|fs_pSX-{}1 Date: Fri, 9 Jul 2021 18:47:41 +0300 Subject: [PATCH 06/12] Comment about where might be the id bug --- parsers/parser_utils.py | 1 + 1 file changed, 1 insertion(+) diff --git a/parsers/parser_utils.py b/parsers/parser_utils.py index 931da87ac1..dc6e1a1b1e 100644 --- a/parsers/parser_utils.py +++ b/parsers/parser_utils.py @@ -16,6 +16,7 @@ def standard_entry_to_dict(article, source, tz, strip_description=False): else: article_dict['abstract'] = article['description'] od = collections.OrderedDict(sorted(article_dict.items())) + # The bug of the key?? article_dict['hash'] = hashlib.sha224(repr(od.items()).encode('utf-8')).hexdigest() article_dict['date_time'] = datetime.now(tz) return article_dict From ff98a64428c82d87b9ad36cbad520f2f36b4a3bd Mon Sep 17 00:00:00 2001 From: db29 Date: Sat, 10 Jul 2021 16:21:08 +0300 Subject: [PATCH 07/12] Process data initial commit --- process_data/process_data.py | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 process_data/process_data.py diff --git a/process_data/process_data.py b/process_data/process_data.py new file mode 100644 index 0000000000..452dc6a638 --- /dev/null +++ b/process_data/process_data.py @@ -0,0 +1,10 @@ + + +from main import main + + +def main(): + pass + +if __name__ == "__main__": + main() From 17ff3bb31e7d5da63ead2bba63c2a3be888a2e0f Mon Sep 17 00:00:00 2001 From: db29 Date: Sat, 10 Jul 2021 16:55:07 +0300 Subject: [PATCH 08/12] Get database file as an argument --- process_data/process_data.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/process_data/process_data.py b/process_data/process_data.py index 452dc6a638..46b092a68e 100644 --- a/process_data/process_data.py +++ b/process_data/process_data.py @@ -1,10 +1,17 @@ +import argparse -from main import main +def process_data(databse_file): + pass def main(): - pass + parser = argparse.ArgumentParser(description='Process some data.') + parser.add_argument('database', help='A path to a database') + + args = parser.parse_args() + process_data(args.database) + if __name__ == "__main__": main() From 605e45c9a581ef65e2c6e97c915145588254e2c3 Mon Sep 17 00:00:00 2001 From: db29 Date: Mon, 12 Jul 2021 22:05:11 +0300 Subject: [PATCH 09/12] Process data methods in dataProvider --- data_provider.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/data_provider.py b/data_provider.py index 8838fb6313..67043e1326 100644 --- a/data_provider.py +++ b/data_provider.py @@ -5,8 +5,8 @@ class DataProvider: - def __init__(self): - self.db = dataset.connect('sqlite:///titles.db') + def __init__(self, db_path="titles.db"): + self.db = dataset.connect(f'sqlite:///{db_path}') self.articles_table = self.db['rss_ids'] self.versions_table = self.db['rss_versions'] @@ -25,6 +25,9 @@ def track_article(self, data: dict): self.versions_table.insert(data) logging.info(f"New article tracked: {data['url']}") + def get_article(self, article_id): + return self.articles_table.find_one(id=article_id) + def get_article_version_count(self, artice_id: str, article_source: str, hash: str): return self.versions_table.count( self.versions_table.table.columns.article_id == artice_id, From a880f8ef5846a4ab1aa48d7a61cce43225d346a7 Mon Sep 17 00:00:00 2001 From: db29 Date: Mon, 12 Jul 2021 22:06:14 +0300 Subject: [PATCH 10/12] Feature Extractors start --- process_data/feature_extractor.py | 12 ++++++++++++ process_data/printer_extractor.py | 7 +++++++ process_data/process_data.py | 18 +++++++++++++++++- 3 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 process_data/feature_extractor.py create mode 100644 process_data/printer_extractor.py diff --git a/process_data/feature_extractor.py b/process_data/feature_extractor.py new file mode 100644 index 0000000000..b5582fb334 --- /dev/null +++ b/process_data/feature_extractor.py @@ -0,0 +1,12 @@ + +class FeatureExtractor(object): + def __init__(self) -> None: + pass + + @staticmethod + def get_cols() -> list: + return [] + + @staticmethod + def extract(data, previous_data, article): + pass diff --git a/process_data/printer_extractor.py b/process_data/printer_extractor.py new file mode 100644 index 0000000000..30bcc2b1bc --- /dev/null +++ b/process_data/printer_extractor.py @@ -0,0 +1,7 @@ +from feature_extractor import FeatureExtractor + + +class PrinterExtractor(FeatureExtractor): + @staticmethod + def extract(data, previous_data, article): + print(data) diff --git a/process_data/process_data.py b/process_data/process_data.py index 46b092a68e..f7ec419363 100644 --- a/process_data/process_data.py +++ b/process_data/process_data.py @@ -1,8 +1,24 @@ import argparse +from printer_extractor import PrinterExtractor +from data_provider import DataProvider + +FEATURE_EXTRACTORS = [PrinterExtractor] + def process_data(databse_file): - pass + dt = DataProvider(databse_file) + + # TODO: setup? - prepare tables/cols + cols = [extractor.get_cols() for extractor in FEATURE_EXTRACTORS] + print(cols) + + # Extract Features + for article in dt.articles_table: + versions = dt.get_ordered_versions(article["article_id"]) + for counter, single_version in enumerate(versions): + for feature_extractor in FEATURE_EXTRACTORS: + feature_extractor.extract(single_version, versions[:counter], article) def main(): From 49360c5419157fcc2d30f0fce16f69c89352800d Mon Sep 17 00:00:00 2001 From: db29 Date: Sat, 17 Jul 2021 20:31:08 +0300 Subject: [PATCH 11/12] Transfered from sqlite to csvs --- process_data/csv_data_provider.py | 10 ++++++++++ process_data/process_data.py | 26 +++++++++++++++----------- requirements.txt | 3 ++- 3 files changed, 27 insertions(+), 12 deletions(-) create mode 100644 process_data/csv_data_provider.py diff --git a/process_data/csv_data_provider.py b/process_data/csv_data_provider.py new file mode 100644 index 0000000000..fc475204a0 --- /dev/null +++ b/process_data/csv_data_provider.py @@ -0,0 +1,10 @@ +import os +import pandas as pd + + +class CsvDataProvider: + def __init__(self, data_files=r"../csvs"): + self._data_files_dir = data_files + self.articles = pd.read_csv(os.path.join(data_files, "articles.csv")) + self.versions = pd.read_csv(os.path.join(data_files, "versions.csv")) + diff --git a/process_data/process_data.py b/process_data/process_data.py index f7ec419363..96b7e30ac5 100644 --- a/process_data/process_data.py +++ b/process_data/process_data.py @@ -1,32 +1,36 @@ import argparse +import itertools from printer_extractor import PrinterExtractor -from data_provider import DataProvider +from csv_data_provider import CsvDataProvider FEATURE_EXTRACTORS = [PrinterExtractor] -def process_data(databse_file): - dt = DataProvider(databse_file) +def process_data(data_files): + dt = CsvDataProvider(data_files) # TODO: setup? - prepare tables/cols - cols = [extractor.get_cols() for extractor in FEATURE_EXTRACTORS] - print(cols) + cols = itertools.chain.from_iterable([extractor.get_cols() for extractor in FEATURE_EXTRACTORS]) + print(list(cols)) # Extract Features - for article in dt.articles_table: - versions = dt.get_ordered_versions(article["article_id"]) - for counter, single_version in enumerate(versions): + for _id, article in dt.articles.iterrows(): + article_versions = dt.versions[(dt.versions["article_id"] == article["article_id"]) & + (dt.versions["article_source"] == article["article_source"])] + + for __id, single_version in article_versions.iterrows(): + past_versions = article_versions[article_versions["version"] < single_version["version"]] for feature_extractor in FEATURE_EXTRACTORS: - feature_extractor.extract(single_version, versions[:counter], article) + feature_extractor.extract(single_version, past_versions, article) def main(): parser = argparse.ArgumentParser(description='Process some data.') - parser.add_argument('database', help='A path to a database') + parser.add_argument('datafiles', help='A path to the folders with the csvs') args = parser.parse_args() - process_data(args.database) + process_data(args.datafiles) if __name__ == "__main__": diff --git a/requirements.txt b/requirements.txt index 20d491402b..559fe52048 100644 --- a/requirements.txt +++ b/requirements.txt @@ -21,4 +21,5 @@ six==1.10.0 SQLAlchemy==1.3.6 tweepy==3.10.0 beautifulsoup4==4.9.3 -flake8==3.8.4 \ No newline at end of file +flake8==3.8.4 +pandas \ No newline at end of file From 37665582bf01c70ce5a41957ae9b583f990ab2f7 Mon Sep 17 00:00:00 2001 From: db29 Date: Sat, 24 Jul 2021 13:46:39 +0300 Subject: [PATCH 12/12] Working better with pandas --- data_provider.py | 9 +++- parsers/base_parser.py | 3 +- process_data/csv_data_provider.py | 5 +- process_data/printer_extractor.py | 1 + process_data/process_data.py | 70 ++++++++++++++++++++++------ process_data/word_token_extractor.py | 16 +++++++ 6 files changed, 83 insertions(+), 21 deletions(-) create mode 100644 process_data/word_token_extractor.py diff --git a/data_provider.py b/data_provider.py index 67043e1326..f282ef4c64 100644 --- a/data_provider.py +++ b/data_provider.py @@ -28,9 +28,14 @@ def track_article(self, data: dict): def get_article(self, article_id): return self.articles_table.find_one(id=article_id) - def get_article_version_count(self, artice_id: str, article_source: str, hash: str): + def get_article_version_count_ex(self, article_id: str, article_source: str): return self.versions_table.count( - self.versions_table.table.columns.article_id == artice_id, + self.versions_table.table.columns.article_id == article_id, + article_source=article_source) + + def get_article_version_count(self, article_id: str, article_source: str, hash: str): + return self.versions_table.count( + self.versions_table.table.columns.article_id == article_id, article_source=article_source, hash=hash) diff --git a/parsers/base_parser.py b/parsers/base_parser.py index 58778b8329..0697505e72 100644 --- a/parsers/base_parser.py +++ b/parsers/base_parser.py @@ -71,8 +71,7 @@ def tweet(self, text: str, article_id: str, url: str, image_path: str): def store_data(self, data: Dict): if self.data_provider.is_article_tracked(data['article_id'], self.get_source()): - count = self.data_provider.get_article_version_count(data[ - 'article_id'], self.get_source(), data['hash']) + count = self.data_provider.get_article_version_count(data['article_id'], self.get_source(), data['hash']) if count != 1: # Changed self.tweet_all_changes(data) else: diff --git a/process_data/csv_data_provider.py b/process_data/csv_data_provider.py index fc475204a0..ac76020ce1 100644 --- a/process_data/csv_data_provider.py +++ b/process_data/csv_data_provider.py @@ -3,8 +3,9 @@ class CsvDataProvider: - def __init__(self, data_files=r"../csvs"): + def __init__(self, data_files=r"../csvs", version=0): self._data_files_dir = data_files self.articles = pd.read_csv(os.path.join(data_files, "articles.csv")) - self.versions = pd.read_csv(os.path.join(data_files, "versions.csv")) + self.versions_file_format = os.path.join(data_files, "versions_{version}.csv") + self.versions = pd.read_csv(self.versions_file_format.format(version=version)) diff --git a/process_data/printer_extractor.py b/process_data/printer_extractor.py index 30bcc2b1bc..7c8de25094 100644 --- a/process_data/printer_extractor.py +++ b/process_data/printer_extractor.py @@ -5,3 +5,4 @@ class PrinterExtractor(FeatureExtractor): @staticmethod def extract(data, previous_data, article): print(data) + return [] diff --git a/process_data/process_data.py b/process_data/process_data.py index 96b7e30ac5..08b3e4963c 100644 --- a/process_data/process_data.py +++ b/process_data/process_data.py @@ -1,36 +1,76 @@ import argparse import itertools +import pandas as pd + from printer_extractor import PrinterExtractor +from word_token_extractor import WordsTokensExtractor from csv_data_provider import CsvDataProvider -FEATURE_EXTRACTORS = [PrinterExtractor] +COLUMNS_TO_KEEP = ["id", "version", "article_id", "article_source", "title", "amount_of_words"] + +ROW_EXTRACTED = { + # "amount_of_words": WordsTokensExtractor.how_many_words +} + +FEATURE_EXTRACTORS = [ + # WordsTokensExtractor, + # PrinterExtractor +] + + +def process_data(data_files, clean_csv, out_version, in_version=0): + # TODO: choose which features to extract + dt = CsvDataProvider(data_files, in_version) + if clean_csv: + # The data we want to keep from the csvs + extracted_features = dt.versions[COLUMNS_TO_KEEP] + else: + extracted_features = dt.versions -def process_data(data_files): - dt = CsvDataProvider(data_files) + # cols based on the same row data - + for col_name, f in ROW_EXTRACTED.items(): + extracted_features[col_name] = dt.versions.apply(f, axis=1, result_type="expand") - # TODO: setup? - prepare tables/cols - cols = itertools.chain.from_iterable([extractor.get_cols() for extractor in FEATURE_EXTRACTORS]) - print(list(cols)) + if len(FEATURE_EXTRACTORS) > 0: + # cols based on a lot of data - + cols = list(itertools.chain.from_iterable([extractor.get_cols() for extractor in FEATURE_EXTRACTORS])) + processed_data = pd.DataFrame(columns=cols) + row_id = 0 - # Extract Features - for _id, article in dt.articles.iterrows(): - article_versions = dt.versions[(dt.versions["article_id"] == article["article_id"]) & - (dt.versions["article_source"] == article["article_source"])] + # Extract Features + for _id, article in dt.articles.iterrows(): + article_versions = dt.versions[(dt.versions["article_id"] == article["article_id"]) & + (dt.versions["article_source"] == article["article_source"])] - for __id, single_version in article_versions.iterrows(): - past_versions = article_versions[article_versions["version"] < single_version["version"]] - for feature_extractor in FEATURE_EXTRACTORS: - feature_extractor.extract(single_version, past_versions, article) + for __id, single_version in article_versions.iterrows(): + past_versions = article_versions[article_versions["version"] < single_version["version"]] + processed_row = [] + for feature_extractor in FEATURE_EXTRACTORS: + processed_row.extend(feature_extractor.extract(single_version, past_versions, article)) + + processed_data.loc[row_id] = processed_row + row_id += 1 + + # TODO: export back to csv + print(f"Max words - {extracted_features['amount_of_words'].max()}") + out_file = dt.versions_file_format.format(version=out_version) + extracted_features.to_csv(out_file) + + print("Done!!") def main(): parser = argparse.ArgumentParser(description='Process some data.') parser.add_argument('datafiles', help='A path to the folders with the csvs') + parser.add_argument('--in-version', default=0, help='Which version to use') + parser.add_argument('--out-version', help='Which version to write') + + parser.add_argument('--clean', action="store_true", help='Should keep only important data') args = parser.parse_args() - process_data(args.datafiles) + process_data(args.datafiles, args.clean, args.out_version, args.in_version) if __name__ == "__main__": diff --git a/process_data/word_token_extractor.py b/process_data/word_token_extractor.py new file mode 100644 index 0000000000..4724ce26b6 --- /dev/null +++ b/process_data/word_token_extractor.py @@ -0,0 +1,16 @@ +from feature_extractor import FeatureExtractor + + +class WordsTokensExtractor(FeatureExtractor): + @staticmethod + def get_cols() -> list: + return ["amount_of_words", "title"] + + @staticmethod + def how_many_words(data): + return data.title.count(" ") + 1 + + @staticmethod + def extract(data, previous_data, article): + amount_of_words = WordsTokensExtractor.how_many_words(data) + return [amount_of_words, data.title]