Рубрики
Без рубрики

Построение книжного червя: информация о книге и рекомендации с использованием Twilio!

В предыдущей статье мы создали бот WhatsApp, чтобы бороться с фальшивыми новостями! Если вы пропустили это, вы можете проверить … Tagged с помощью машинного обучения, Python, AI, Twilio Hackathon.

В предыдущей статье мы создали бот WhatsApp, чтобы бороться с фальшивыми новостями! Если вы пропустили это, вы можете проверить это здесь. В этом подробном учебнике мы увидим, как мы можем построить бот, который даст нам некоторые рекомендации по книге и сообщить нам информацию о книге, которую мы хотим.

Давайте просто перейдем к этому!

Цель:

Мы будем строить бот WhatsApp, который даст нам больше информации о книге, чье имя мы будем предоставлять в качестве вклада, а также рекомендуем нам аналогичные книги!

Что нам понадобится?

Набор данных:

Мы будем использовать Goodbooks-10K набор данных.

Этот набор данных содержит шесть миллионов рейтингов для десяти тысяч самых популярных (с большинством рейтингов). Это также:

  • книги, помеченные для чтения пользователями
  • Книжные метаданные (автор, год и т. Д.)
  • теги/полки/жанры

Вы можете скачать Zippd Data отсюда: https://github.com/zygmuntz/goodbooks-10k/releases

Предварительная обработка:

Мы сделаем некоторую предварительную обработку для начальной стадии. Это готово к использованию набора данных, хотя мы бросим несколько столбцов, которые мы не будем использовать, и заполним несколько пустых ячеек. Первоначально набор данных имеет 23 столбца, из которых мы отбросили 4 столбца, которые являются заголовком, work_ratings_count, image_url и small_image_url, поскольку мы не будем их использовать.

# importing pandas module 
import pandas as pd 

# making data frame from csv file 
books = pd.read_csv("books.csv", index_col ="Name" ) 

# dropping passed columns 
books.drop(["title", "work_ratings_count",  "image_url", "small_image_url"], axis = 1, inplace = True)

#filling blank values with "Not Available" 
books = books.fillna("Not Available")

Мы сделаем некоторое время от времени форматирование, когда это необходимо.

Давайте разделим дальнейшую задачу на два модуля:

  1. Получить информацию о книге
  2. Система рекомендаций книги

Посмотрим первой части:

1. Получить информацию о книге:

Эта часть очень проста, и вам не нужно ничего знать, кроме базового питона. Здесь мы рассмотрим наш чистый файл CSV, который мы получаем после предварительной обработки и поиск заголовка книги, который мы получили от пользователя в поле «Заголовок» в CSV (которое переименовано в оригинальное поле заголовка). Если мы найдем матч, мы вернем индекс этой строки и сохраним этот индекс в список соответствующих книг. Итак, теперь у нас есть список индексов, соответствующих пользовательскому запросу. Теперь мы можем получить любую информацию, которую мы хотим, так что давайте просто оставим этот список на секунду.

def get_matches(book_title):
    matching_books_list = []
    with open('clean_books.csv', 'r') as file_reader:
        flines = file_reader.readline()
        print(flines.rstrip())
        search = file_reader.readlines()

        for i, sline in enumerate(search):
            if book_title.upper() in sline.upper():
                matching_books_list.append(i)
    return matching_books_list

Теперь мы должны увидеть, как мы можем сделать вывод для подачи результатов на WhatsApp! Давайте создадим сервер Flask для того, что мы можем использовать для обслуживания API нашей книги.

app = Flask(__name__)
@app.route('/sms', methods=['POST'])
def sms():
    resp = MessagingResponse()
    inbMsg = request.values.get('Body')
    book_list = book_ratings.get_matches(inbMsg)
    df = pd.read_csv('clean_books.csv')
    for i in book_list:
        resp.message(
            'The book with title' + df['original_title'].iloc[i] + 'written by ' + df['authors'].iloc[i] +'has average user rating of ' + str(df['average_rating'].iloc[i])+' and this book is reviewed by '+str(df['work_text_reviews_count'].iloc[i]+'people.')'.\n ---------------------------------')
    return str(resp)

Теперь давайте пойдем вперед и посмотрим, как мы можем построить механизм рекомендаций.

2. Двигатель рекомендаций по книге:

Мы будем генерировать рекомендации, используя 3 разных критерия. Для всех них мы будем векторизировать ввод и обнаружим сходство косинуса с нашими конкретными столбцами в нашем наборе данных и возвращаем те, которые имеют очень высокое сходство. Посмотрим, как мы можем это сделать

  • Авторские рекомендации:
tf = TfidfVectorizer(analyzer='word',ngram_range=(1, 2),min_df=0, stop_words='english')
tfidf_matrix = tf.fit_transform(books['authors'])
cosine_sim = linear_kernel(tfidf_matrix, tfidf_matrix)

# Build a 1-dimensional array with book titles
titles = books['title']
indices = pd.Series(books.index, index=books['title'])

# Function that get book recommendations based on the cosine similarity score of book authors
def authors_recommendations(title):
    idx = indices[title]
    sim_scores = list(enumerate(cosine_sim[idx]))
    sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True)
    sim_scores = sim_scores[1:21]
    book_indices = [i[0] for i in sim_scores]
    return titles.iloc[book_indices]
  • Рекомендации на основе тегов:
tf1 = TfidfVectorizer(analyzer='word',ngram_range=(1, 2),min_df=0, stop_words='english')
tfidf_matrix1 = tf1.fit_transform(books_with_tags['tag_name'].head(10000))
cosine_sim1 = linear_kernel(tfidf_matrix1, tfidf_matrix1)

# Build a 1-dimensional array with book titles
titles1 = books['title']
indices1 = pd.Series(books.index, index=books['title'])

# Function that get book recommendations based on the cosine similarity score of books tags
def tags_recommendations(title):
    idx = indices1[title]
    sim_scores = list(enumerate(cosine_sim1[idx]))
    sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True)
    sim_scores = sim_scores[1:21]
    book_indices = [i[0] for i in sim_scores]
    return titles.iloc[book_indices]

  • Рекомендации на основе тела: в этом мы будем создавать рекомендацию книг, используя атрибуты авторов и тегов для лучших результатов. Мы создадим корпус функций и рассчитываем TF-IDF на корпусе атрибутов для получения лучших рекомендаций.
books['corpus'] = (pd.Series(books[['authors', 'tag_name']]
                .fillna('')
                .values.tolist()
                ).str.join(' '))

tf_corpus = TfidfVectorizer(analyzer='word',ngram_range=(1, 2),min_df=0, stop_words='english')
tfidf_matrix_corpus = tf_corpus.fit_transform(books['corpus'])
cosine_sim_corpus = linear_kernel(tfidf_matrix_corpus, tfidf_matrix_corpus)

# Build a 1-dimensional array with book titles
titles = books['title']
indices = pd.Series(books.index, index=books['title'])

# Function that get book recommendations based on the cosine similarity score of books tags
def corpus_recommendations(title):
    idx = indices1[title]
    sim_scores = list(enumerate(cosine_sim_corpus[idx]))
    sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True)
    sim_scores = sim_scores[1:5]
    book_indices = [i[0] for i in sim_scores]
    return titles.iloc[book_indices]

Вышеупомянутые функции вернут список рекомендуемых книг, но для вывода мы вернем список индексов, которые соответствуют нашим критериям с использованием return book_indices вместо return titles.iloc [book_indices] Анкет

Теперь давайте посмотрим, как будет работать вывод в случае системы рекомендаций книг.

app = Flask(__name__)
@app.route('/sms', methods=['POST'])
def sms():
    resp = MessagingResponse()
    inbMsg = request.values.get('Body')
    rec = recommendations.corpus_recommendations(inbMsg)
    df = pd.read_csv('clean_books.csv')
    resp.message('Recommendations based on your input:')
    for i in rec:
        resp.message (df['original_title'].iloc[i+2]+ "\n")
    return str(resp)

Вы можете использовать любую из функций рекомендации, хотя я использовал здесь рекомендацию корпуса, поскольку она рассматривает как автора, так и теги.

Последние шаги

Как только это будет сделано, мы запустим наш сервер Flask, используя это:

FLASK_APP=app:app FLASK_ENV=development flask run

Чтобы проверить это, нам нужно открыть туннель для нашего сервера, работающего на нашей машине. Мы будем использовать NGROK для этого. Запустите это, как только вы установили NGROK:

ngrok http 5000

Это откроет туннель, указывающий на порт 5000 и предоставит нам общедоступный URL -адрес NGROK, который будет указывать на наше местное заявление. Теперь мы должны открыть песочницу WhatsApp в нашей консоли Twilio и ввести URL -адрес плюс путь /смс в поле с надписью Когда появляется сообщение Анкет

Давайте отправим наш номер песочницы сообщение с названием книги и давайте посмотрим на результаты:

  • Информация о книге
  • Рекомендация книги

Мы успешно сгенерировали информацию о книге и рекомендации! Разве это не круто?

Вы можете найти полный код Здесь Анкет

Что дальше?

Это было основным вступлением в то, как вы можете создать систему рекомендаций, используя API Twilio WhatsApp или API обмена сообщениями. Вы можете использовать аналогичный подход, чтобы повысить качество обслуживания клиентов в вашем бизнесе. Что вы планируете построить с этим? Дайте мне знать в комментариях ниже или нажмите меня на Твиттер !

Оригинал: “https://dev.to/twilio/building-bookworm-a-book-info-recommendation-bot-using-twilio-i63”