Чат-бот на Python (Deep Learning + TensorFlow). Часть IV: строим логику

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