Bygga WhatsApp / Telegram-bot som pratar som du använder alpes.ai

Låt oss bygga en bot som automatiskt föreslår svar för dina inkommande meddelanden på chattapplikationer Foto via Pixabay)

Bakgrund

Google har introducerat smarta svar på Gmail för en tid sedan, det är verkligen bra när det gäller att skicka snabba svar när du är på språng. Det hade varit fantastiskt om den här funktionen är tillgänglig på andra chattapplikationer som (WhatsApp, Telegram, skype, slack etc). Så låt oss försöka bygga en modell som föreslår autosvar för korta meddelanden.

Hög nivå tillvägagångssätt

Problemet är att med tanke på ett meddelande måste vi föreslå ett svar på det baserat på lärdomar från våra tidigare svar

Så vi vill lösa detta är att vi har meddelanden, svar som träning, nästa gång vi får ett nytt meddelande måste vi leta efter ett liknande meddelande i våra tågdata och välja svaret som ett föreslaget svar. Vårt antagande är att svar på liknande frågor kommer att vara liknande t.ex. meddelanden som hur har du det? hur är hon? hur är filmen? kommer att ha svar som "bra", "ok" osv. så när du får ett meddelande som "hur är barnet" förmodligen är ett av ovanstående svar ett bra förslag

Rörledning

dataset

Datasättet för den här typen av problem kräver tillfälliga meddelanden och svar, det var mycket svårt att hitta ett anständigt dataset i detta format på Internet. Det där datasätt som NUS SMS corpus, Ubuntu chat corpus men problemen med dem är att antingen de är mycket domänspecifika eller svåra att konvertera dem till meddelanden, svara format. du kan använda detta Facebook-Messenger-Bot-verktyg för att extrahera din FB-messenger, Gtalk, WhatsApp eller länkad chatt om du är väldigt aktiv på dem men jag använder inte dessa tjänster och mina vänner som använder dem var inte villiga att dela sina personliga chatta data för min forskning så det här verktyget hjälpte mig inte.

När jag letade efter datauppsättningarna hade jag hittat nedan 3 vilket jag tror kan vara användbart om vi gör en sanering och konverterar dem till meddelandet-> svarformat.

  • Cornell Movie - Dialogs Corpus
  • The Conversational Intelligence Challenge 2 (ConvAI2)
  • rdany-konversationer

Efter att ha använt lite tid och manuellt rensat upp de flesta av dessa meddelanden kunde vi samla in cirka 25 000 meddelanden och svar från dessa datasätt.

importera pandor som pd chat_messages_df = pd.read_csv ('data / complete-chat-data.csv') chat_messages_df.sample (10)
Exempel på data från chattdatasättet.

Text Förbehandling

I textförbehandlingsenhet, vi vill ta bort punkteringar utföra tokenisering och sedan lemmatisering för att se till att orden vi har att göra är konsekventa (Lemmatisering är en teknik för att få ordets rotform). Spacy är ett bra bibliotek att göra text bearbetning.

importera spacy från spacy.lang.en importera engelska parser = engelska () importera strängpunkter = string.punctuation nlp = spacy.load ('en')
def message_pre_process (meddelande): mytokens = parser (meddelande) mytokens = [word.lemma_.lower (). strip () om word.lemma_! = "-PRON-" annars word.lower_ för word i mytokens] mytokens = [word för ord i mytokens om ord inte i punkteringar] tryck (mytokens) returnerar mytokens

vectorizer

Vi måste konvertera texten till en vektor för att mata den till en algoritm låter använda en enkel TF-IDF-vektorizer för att konvertera våra meddelanden till vektors

från sklearn.feature_extraction.text import TfidfVectorizer kwargs = {'tokenizer': message_pre_process, 'max_features': 1500 # detta är den maximala ordlistan jag väljer att arbeta med. } tfvectorizer = TfidfVectorizer (** kwargs) train_vec = tfvectorizer.fit_transform (chat_messages_df ['Fråga']. Values.astype (str))

För att mata träningsdata till en algoritm behöver vi train_data-vektor och tågetiketter. låt oss använda pandans index-id som etikett så att vi senare kan få tillhörande svar på den etiketten genom att fråga dataramen lätt. Jag har sammankopplat tågvektorn och tågmärket och sparat den i en fil

importera numpy som np train_labels = np.array (chat_messages_df.index.values ​​[:, np.newaxis]) train_data = np.concatenate ((train_labels, train_vec.toarray ()), Axe = 1) np.savetxt ('data / chat-train-vector-data.csv ', train_data, delimiter =', ')! zip data / chat-train-cector-data.csv.zip data / chat-train-vector-data.csv

Modellträning

Vi har tågdata som en CSV (chat-train-vector-data.csv) som vi kan använda ALPES API för utbildning. Zipa tågdatafilen för snabbare uppladdningar och gör sedan en uppladdning, tåg och få Status API-samtal du kan hänvisa till API-dokumentation

När modellen tränas får du ett svar från servern som nedan

Träningsstatus: {u'status ': u'SUCCESS', u'result ': u "{' traintime ':' [Fre, 21 dec. 2018 19:49:20 UTC] Förfluten tid: 00: 00: 39.606144 ', 'modell': u'model_1412115 '} "}

Observera modellnamnet (model_1412115) som vi måste använda när vi får förutsägelsen för testmeddelandet

Förutsägelse för svarförslag

När vi frågar modellen med en testfråga skickar den ett n antal etikett-ID: er som ett svar som är närmast testfrågan. låt oss skapa en funktion som accepterar en rad etikett-ID och returnerar textsvaret.

def get_replies (replarry): s1 = list () för svar i replarry: s1.append (''. gå med (str (chat_messages_df.loc [svar] ['Svara']. värden))) returnera s1

ges ett testmeddelande som "när kommer du tillbaka" måste vi konvertera det till vektor och sedan fråga modellen

Provutgång:

Inmatningsmeddelande: när kommer du tillbaka? föreslog svar: ["['Jag vet inte.']", "['Just nu']", "['inte för sent']"]

Live-demonstration av denna app är tillgänglig på http://api.alpes.ai/sm.html

Hur vi kan göra det bättre

Det finns en hel del förbättringar för denna grundmodell

  • Vi har använt en mycket grundläggande form av textvektorisator TF-IDF. vi kan använda en bra mening för att visa modeller som BERT för att få en fast längdvektor för korta textmeddelanden.
  • undvik semantiskt liknande svar i förslag. vi måste visa svar som skiljer sig mycket från varandra, till exempel: för ett meddelande som "hur mår du", desto bättre får vi förslag som positiva, negativa och neutrala till skillnad från "Jag har det bra", "Jag har det bra", "ok hur är det med dig ”där alla ger positivt budskap. detta kan arkiveras genom att göra en semantisk gruppering av svar. av alla föreslagna svarade välj bara de som tillhör olika kluster.