Предыдущая статья — Чат-бот на Python (Deep Learning + TensorFlow). Часть III: буферизация данных.
Добро пожаловать в четвертую часть серии статей про создание чат-бота при помощи алгоритмов глубокого обучения и библиотеки TensorFlow. До этого мы получили наши данные и научились их перебирать. Теперь мы готовы приступить к созданию реальной логики для создания входных данных.
Для начала мы наложим следующее ограничение: мы хотим иметь дело только с осмысленными комментариями. Для этого мы будем отбирать только те комментарии, за которые проголосовали минимум двое. На данный момент наш код имеет следующий вид:
import sqlite3 import json from datetime import datetime timeframe = '2015-05' sql_transaction = [] connection = sqlite3.connect('{}.db'.format(timeframe)) c = connection.cursor() def create_table(): c.execute("CREATE TABLE IF NOT EXISTS parent_reply(parent_id TEXT PRIMARY KEY, comment_id TEXT UNIQUE, parent TEXT, comment TEXT, subreddit TEXT, unix INT, score INT)") def format_data(data): data = data.replace('\n',' newlinechar ').replace('\r',' newlinechar ').replace('"',"'") return data def find_parent(pid): try: sql = "SELECT comment FROM parent_reply WHERE comment_id = '{}' LIMIT 1".format(pid) c.execute(sql) result = c.fetchone() if result != None: return result[0] else: return False except Exception as e: #print(str(e)) return False if __name__ == '__main__': create_table() row_counter = 0 paired_rows = 0 with open('J:/chatdata/reddit_data/{}/RC_{}'.format(timeframe.split('-')[0],timeframe), buffering=1000) as f: for row in f: row_counter += 1 row = json.loads(row) parent_id = row['parent_id'] body = format_data(row['body']) created_utc = row['created_utc'] score = row['score'] comment_id = row['name'] subreddit = row['subreddit'] parent_data = find_parent(parent_id)[python_ad_block]
Теперь давайте потребуем, чтобы оценка была два или выше, а затем также посмотрим, есть ли уже ответ на родительский комментарий и какова его оценка:
if __name__ == '__main__': create_table() row_counter = 0 paired_rows = 0 with open('J:/chatdata/reddit_data/{}/RC_{}'.format(timeframe.split('-')[0],timeframe), buffering=1000) as f: for row in f: row_counter += 1 row = json.loads(row) parent_id = row['parent_id'] body = format_data(row['body']) created_utc = row['created_utc'] score = row['score'] comment_id = row['name'] subreddit = row['subreddit'] parent_data = find_parent(parent_id) # maybe check for a child, if child, is our new score superior? If so, replace. If not... if score >= 2: existing_comment_score = find_existing_score(parent_id)
Далее нам нужно создать функцию find_existing_score()
:
def find_existing_score(pid): try: sql = "SELECT score FROM parent_reply WHERE parent_id = '{}' LIMIT 1".format(pid) c.execute(sql) result = c.fetchone() if result != None: return result[0] else: return False except Exception as e: #print(str(e)) return False
Если комментарий уже существует, и если оценка нового комментария выше, мы хотели бы заменить его на новый:
if score >= 2: existing_comment_score = find_existing_score(parent_id) if existing_comment_score: if score > existing_comment_score:
Кроме того, многие комментарии могут удаляться. Также некоторые комментарии могут быть либо очень длинными, либо очень короткими. Мы хотим убедиться, что комментарии имеют приемлемую длину для обучения, а также проверить, что они не были удалены:
def acceptable(data): if len(data.split(' ')) > 50 or len(data) < 1: return False elif len(data) > 1000: return False elif data == '[deleted]': return False elif data == '[removed]': return False else: return True
Отлично, на данный момент мы уже готовы начать составлять базу данных, чем мы и займемся в следующей статье:
Чат-бот на Python (Deep Learning + TensorFlow). Часть V: построение базы данных.