Чатбот для поиска текста в закрытом домене на суахили

Введение

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

  1. Объем его источника данныхЭту категорию можно разделить на следующие:-.

a. Чатбот с открытым доменом
-Это тип чатбота, который использует источник данных с одной темой, этот источник может быть расположен локально или из сети.

b. Чатбот с закрытым доменом
-Это тип чатбота, который использует источник данных с несколькими темами, этот источник может быть как локальным, так и онлайн.

  1. Средства, которые он использует для получения ответовЭту категорию можно разделить на следующие:-.

a. Чатбот, самостоятельно генерирующий ответы
-Это относится к типу чатбота, который автоматически генерирует свои ответы в соответствии с источником данных с открытым или закрытым доменом, который он изучил.

b. Чатбот с полученными ответами
-Это тип чатбота, который дает свои ответы, извлекая их из источника данных с открытым доменом или закрытым доменом, хранящегося онлайн или локально.

Типы

Таким образом, в соответствии с этими категориями, существует пять типов чатботов, а именно:-
i. Чатбот с открытым доменом, самостоятельно генерирующий ответы
ii. Чатбот с открытым доменом, получающий ответы
iii. Самогенерирующийся ответный чатбот в закрытой области
iv. Чатбот для поиска ответа в закрытой области
v. Гибридный чатбот

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

i. NumPy
ii. Pandas
iii. NLTK
iv. Sci-kit learn
v. Newspaper3k

Реализация

Начнем:

Импорт библиотек и модулей

import io
import random
import string
import warnings
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
import nltk
import re
import pandas as pd
from newspaper import Article


warnings.filterwarnings('ignore')

Вход в полноэкранный режим Выход из полноэкранного режима

Установка модулей и библиотек nltk, пожалуйста, запустите это один раз

nltk.download('popular', quiet=True)
nltk.download('punkt')
nltk.download('wordnet')
nltk.download('omw-1.4')

Войдите в полноэкранный режим Выход из полноэкранного режима

Получение данных из источника данных/файла для локального источника

file = open('tarakilishi.txt','r',errors = 'ignore')
raw = file.read()
raw = raw.lower()

Вход в полноэкранный режим Выход из полноэкранного режима

Получение данных из источника данных/файла при использовании онлайн-источника

raw = Article('https://simple.wikipedia.org/wiki/Light')
raw.download()
raw.parse()
raw.nlp()
raw = raw.text

Войти в полноэкранный режим Выйти из полноэкранного режима

Токенизация данных из источника данных

sent_tokens = nltk.sent_tokenize(raw)
word_tokens = nltk.word_tokenize(raw)

Войти в полноэкранный режим Выход из полноэкранного режима

Определение функции для ламетризации маркеров данных

def LemetizeTokens(tokens):
    lemmer = nltk.stem.WordNetLemmatizer()
    return [lemmer.lemmatize(token) for token in tokens]
Вход в полноэкранный режим Выход из полноэкранного режима

Определение функции для нормализации ламетризованных лексем данных

def LemetizationNormalize(text):
    remove_punct_dict = dict((ord(punct), None) for punct in string.punctuation)
    return LemetizeTokens(nltk.word_tokenize(text.lower().translate(remove_punct_dict)))

Вход в полноэкранный режим Выход из полноэкранного режима

Определение вводимых пользователем данных и ответов бота

USER_GREETING_INPUTS = ("habari", "habari za sahizi", "habari za asubuhi", "habari za mchana", "habari za jioni", "habari za usiku", "mambo", "habari?", "habari za sahizi?", "habari za asubuhi?", "habari za mchana?", "habari za jioni?", "habari za usiku?", "mambo?")
BOT_GREETING_RESPONSES = ["nzuri", "poa", "salama", "kheri"]

Вход в полноэкранный режим Выход из полноэкранного режима

Определение функции для обработки приветствия пользователя и реакции бота на это приветствие

def greeting(sentence):
    for word in sentence.split():
        if word.lower() in USER_GREETING_INPUTS:
            return random.choice(BOT_GREETING_RESPONSES)
Вход в полноэкранный режим Выход из полноэкранного режима

Обработка стоп-слов

data_file = pd.read_csv('Common Swahili Stop-words.csv')
swahili_stop_words = list(data_file['StopWords'])

Вход в полноэкранный режим Выход из полноэкранного режима

Определение функции для обработки ответов бота

def response(user_response):
    bot_response=''
    sent_tokens.append(user_response)
    TfidfVec = TfidfVectorizer(tokenizer=LemetizationNormalize, stop_words=swahili_stop_words)
    tfidf = TfidfVec.fit_transform(sent_tokens)
    vals = cosine_similarity(tfidf[-1], tfidf)
    idx=vals.argsort()[0][-2]
    flat = vals.flatten()
    flat.sort()
    req_tfidf = flat[-2]
    if(req_tfidf==0):
        robo_response=bot_response+"Samahani sijakuelewa, unaweza rudia tena!!"
        return bot_response
    else:
        bot_response = bot_response+sent_tokens[idx]
        return bot_response
Вход в полноэкранный режим Выход из полноэкранного режима

Определение функции для обработки потока разговоров


flag=True
print("BOT: Habari, tuzungumze kuhusu tanakishi/kompyuta, iwapo huitaji kuendelea na mazungumzo, sema inatosha")
while(flag==True):
    user_response = input("YOU: ")
    user_response=user_response.lower()
    if(user_response!='inatosha'):
        if(user_response=='asante' or user_response=='asante pia' ):
            flag=False
            print("BOT: usijali")
        else:
            if(greeting(user_response)!=None):
                print("BOT: "+greeting(user_response))
            else:
                print("BOT: ",end="")
                print(response(user_response))
                sent_tokens.remove(user_response)
    else:
        flag=False
        print("BOT: asante, karibu tena!!")

Вход в полноэкранный режим Выход из полноэкранного режима

Это все, исходный код можно найти здесь

Оцените статью
devanswers.ru
Добавить комментарий