Предыдущая статья — Чат-бот на 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: построение базы данных.

