Skip to content

๐Ÿค– ืื™ืš ืœื‘ื ื•ืช ื‘ื•ื˜ ื˜ืœื’ืจื ืœื•ืžื“ ืฉืžื—ืคืฉ ื’ื ื‘ื•ื•ื™ืงื™ืคื“ื™ื” โ€“ ื‘ืขื‘ืจื™ืช!

ืžืฆื•ื™ืŸ! ื”ื ื” ืžื“ืจื™ืš ืขื‘ืจื™, ืžืคื•ืจื˜ ืฉืœื‘ ืื—ืจ ืฉืœื‘, ืœื‘ื ื™ื™ืช ื‘ื•ื˜ ื˜ืœื’ืจื ืฉืœื•ืžื“ ืชื•ืš ื›ื“ื™ ืฉื™ื—ื” ื•ื™ื•ื“ืข ื’ื ืœื—ืคืฉ ืชืฉื•ื‘ื•ืช ื‘ื•ื•ื™ืงื™ืคื“ื™ื” โ€“ ื”ื›ืœ ื‘ืฉืคืช Python, ืขื ื”ืชืืžื•ืช ืžืœืื•ืช ืœืขื‘ืจื™ืช:


ืฉืœื‘ 1: ื”ืชืงื ืช ืกืคืจื™ื•ืช

ืœืคื ื™ ืฉื ืชื—ื™ืœ ืœืชื›ื ืช, ื ืฆื˜ืจืš ืœื”ืชืงื™ืŸ ืฉืœื•ืฉ ืกืคืจื™ื•ืช:

  • pyTelegramBotAPI โ€“ ืœืฉืœื™ื—ืช ื•ืงื‘ืœืช ื”ื•ื“ืขื•ืช ื‘ื˜ืœื’ืจื
  • wikipedia โ€“ ื›ื“ื™ ืœื—ืคืฉ ืชืฉื•ื‘ื•ืช ื‘ื•ื•ื™ืงื™ืคื“ื™ื”
  • scikit-learn โ€“ ื›ื“ื™ ืœืœืžื“ ืืช ื”ื‘ื•ื˜ ืœืขื ื•ืช ืขืœ ืฉืืœื•ืช (ืœืžื™ื“ืช ืžื›ื•ื ื” ื‘ืกื™ืกื™ืช)

ืคืชื—ื• ืืช ื”ื˜ืจืžื™ื ืœ ื•ื”ืงืœื™ื“ื•:

pip install pyTelegramBotAPI wikipedia scikit-learn

ืฉืœื‘ 2: ื™ื™ื‘ื•ื ืกืคืจื™ื•ืช, ื”ื’ื“ืจืช ื”ื‘ื•ื˜, ื•ื”ื’ื“ืจืช ืฉืคืช ื•ื™ืงื™ืคื“ื™ื”

import telebot, wikipedia, re
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.linear_model import LogisticRegression
  • ื›ืืŸ ืื ื—ื ื• ืžื™ื™ื‘ืื™ื ืืช ื›ืœ ื”ืกืคืจื™ื•ืช.
  • ื ื’ื“ื™ืจ ืืช ืฉืคืช ื•ื™ืงื™ืคื“ื™ื” ืœืขื‘ืจื™ืช:
wikipedia.set_lang("he")
  • ื ื™ืฆื•ืจ ืืช ื”ื‘ื•ื˜ ืขื ื”ื˜ื•ืงืŸ ืฉืงื™ื‘ืœืชื ืžึพBotFather:
bot = telebot.TeleBot('ื”ื›ื ืก_ื›ืืŸ_ืืช_ื”ื˜ื•ืงืŸ_ืฉืœืš')

ืฉืœื‘ 3: ื ื™ืงื•ื™ ื˜ืงืกื˜ ืžื”ืžืฉืชืžืฉื™ื

ื›ื“ื™ ืฉื”ืžื•ื“ืœ ื™ื•ื›ืœ ืœื”ื‘ื™ืŸ ืืช ื”ืงืœื˜ ืžื”ืžืฉืชืžืฉ, ื ื ืงื” ืžืžื ื• ืกื™ืžื ื™ื ืžื™ื•ืชืจื™ื. ื ื’ื“ื™ืจ ืคื•ื ืงืฆื™ื” ืฉืชื ืงื” ืืช ื”ื˜ืงืกื˜, ื•ื ืฉืชืžืฉ ื‘ืื•ืชื™ื•ืช ืขื‘ืจื™ื•ืช ื‘ืœื‘ื“.

def clean_str(r):
    r = r.lower()
    r = [c for c in r if c in alphabet]
    return ''.join(r)

# ืชื•ื•ื™ื ืžื•ืชืจื™ื ื‘ืขื‘ืจื™ืช:
alphabet = ' ืื‘ื’ื“ื”ื•ื–ื—ื˜ื™ื›ืœืžื ืกืขืคืฆืงืจืฉืช0123456789?%.,()!:;'

ืฉืœื‘ 4: ืงื•ื‘ืฅ ื”ื“ื™ืืœื•ื’ื™ื โ€“ ื”ื‘ืกื™ืก ืœืœืžื™ื“ืช ื”ื‘ื•ื˜

ืฆืจื• ืงื•ื‘ืฅ ื‘ืฉื dialogues.txt ื‘ืื•ืชื” ืชื™ืงื™ื™ื” ืฉื‘ื” ื ืžืฆื ื”ืงื•ื“ ืฉืœื›ื. ื›ืœ ืฉื•ืจื” ื‘ืงื•ื‘ืฅ ืชื”ื™ื” ื–ื•ื’ ืฉืœ ืฉืืœื” ื•ืชืฉื•ื‘ื”, ืœื“ื•ื’ืžื”:

ืฉืœื•ื\ืฉืœื•ื ื•ื‘ืจื›ื”!
ืžื” ืฉืœื•ืžืš\ืื ื™ ืžืจื’ื™ืฉ ืžืฆื•ื™ืŸ!
ืžื™ ืืชื”\ืื ื™ ื”ื‘ื•ื˜ ืฉืœืš.

ืฉื™ืžื• ืœื‘: ื”ืฉืืœื” ืœืคื ื™ \, ื•ื”ืชืฉื•ื‘ื” ืื—ืจื™.


ืฉืœื‘ 5: ืงืจื™ืืช ื”ืงื•ื‘ืฅ ื•ื”ื›ื ืช ืžื•ื“ืœ ื”ืœืžื™ื“ื”

def update():
    with open('dialogues.txt', encoding='utf-8') as f:
        content = f.read()

    blocks = content.split('\n')
    dataset = []

    for block in blocks:
        replicas = block.split('\\')[:2]
        if len(replicas) == 2:
            pair = [clean_str(replicas[0]), clean_str(replicas[1])]
            if pair[0] and pair[1]:
                dataset.append(pair)

    X_text = []
    y = []

    for question, answer in dataset[:10000]:
        X_text.append(question)
        y.append(answer)

    global vectorizer
    vectorizer = CountVectorizer()
    X = vectorizer.fit_transform(X_text)

    global clf
    clf = LogisticRegression()
    clf.fit(X, y)

update()

๐Ÿ” ืžื” ืงื•ืจื” ื›ืืŸ?

  • ื˜ื•ืขื ื™ื ืืช ื›ืœ ื”ืฉืืœื•ืช ื•ื”ืชืฉื•ื‘ื•ืช ืžื”ืงื•ื‘ืฅ.
  • ืžื ืงื™ื ืืช ื”ืฉืืœื•ืช ื•ื”ืชืฉื•ื‘ื•ืช.
  • ื”ื•ืคื›ื™ื ืื•ืชืŸ ืœ"ื•ืงื˜ื•ืจื™ื" ื‘ืขื–ืจืช CountVectorizer.
  • ืžืืžื ื™ื ืžื•ื“ืœ LogisticRegression ื›ื“ื™ ืฉื™ื•ื›ืœ ืœื ื—ืฉ ืืช ื”ืชืฉื•ื‘ื” ื”ื›ื™ ืžืชืื™ืžื” ืœืฉืืœื” ื—ื“ืฉื”.

ืฉืœื‘ 6: ื”ืคืงืช ืชืฉื•ื‘ื” ืžื”ืžื•ื“ืœ

def get_generative_replica(text):
    text_vector = vectorizer.transform([text]).toarray()[0]
    answer = clf.predict([text_vector])[0]
    return answer

๐Ÿ“Œ ื›ืืŸ ืื ื—ื ื• ืžืงื‘ืœื™ื ืฉืืœื” ืžื”ืžืฉืชืžืฉ ื•ืžื—ื–ื™ืจื™ื ืืช ื”ืชืฉื•ื‘ื” ื”ื›ื™ ืžืชืื™ืžื” ืžืชื•ืš ืžื” ืฉืœืžื“ื ื•.


ืฉืœื‘ 7: ื—ื™ืคื•ืฉ ืชืฉื•ื‘ื” ื‘ื•ื•ื™ืงื™ืคื“ื™ื”

def getwiki(s):
    try:
        ny = wikipedia.page(s)
        wikitext = ny.content[:1000]
        wikimas = wikitext.split('.')
        wikimas = wikimas[:-1]
        wikitext2 = ''
        for x in wikimas:
            if not('==' in x):
                if len(x.strip()) > 3:
                    wikitext2 += x + '.'
            else:
                break
        wikitext2 = re.sub('\([^()]*\)', '', wikitext2)
        wikitext2 = re.sub('\{[^\{\}]*\}', '', wikitext2)
        return wikitext2
    except Exception:
        return 'ืœื ืžืฆืืชื™ ืžื™ื“ืข ื‘ื ื•ืฉื ื”ื–ื” ื‘ื•ื•ื™ืงื™ืคื“ื™ื”.'

๐Ÿ“š ื”ืคื•ื ืงืฆื™ื” ื”ื–ื•:

  • ืžื—ืคืฉืช ืขืจืš ื‘ื•ื•ื™ืงื™ืคื“ื™ื” ืœืคื™ ืฉืื™ืœืชืช ื”ืžืฉืชืžืฉ.
  • ืžื—ื–ื™ืจื” ืืช 1000 ื”ืชื•ื•ื™ื ื”ืจืืฉื•ื ื™ื ื‘ืขืจืš.
  • ืžื ืงื” ืกื•ื’ืจื™ื™ื ื•ื”ืขืจื•ืช ืฉื•ืœื™ื™ื.

ืฉืœื‘ 8: ืžืขื ื” ืœืžืฉืชืžืฉ ื‘ื˜ืœื’ืจื

@bot.message_handler(commands=['start'])
def start_message(message):
    bot.send_message(message.chat.id, "ืฉืœื•ื ืื“ื•ื ื™, ืื™ืš ืืคืฉืจ ืœืขื–ื•ืจ?")

question = ""

@bot.message_handler(content_types=['text'])
def get_text_messages(message):
    command = message.text.lower()
    if command == "ืœื ื ื›ื•ืŸ":
        bot.send_message(message.from_user.id, "ืื– ืžื” ื”ืชืฉื•ื‘ื” ื”ื ื›ื•ื ื”?")
        bot.register_next_step_handler(message, wrong)
    else:
        global question
        question = command
        reply = get_generative_replica(command)
        if reply == "ื•ื™ืงื™ ":
            bot.send_message(message.from_user.id, getwiki(command))
        else:
            bot.send_message(message.from_user.id, reply)

๐ŸŽฏ ืื ื”ืžืฉืชืžืฉ ื›ื•ืชื‘ "ืœื ื ื›ื•ืŸ", ื”ื‘ื•ื˜ ืฉื•ืืœ "ืื– ืžื” ื”ืชืฉื•ื‘ื”?", ื•ืžื•ืกื™ืฃ ืื•ืชื” ืœืงื•ื‘ืฅ.


ืฉืœื‘ 9: ืขื“ื›ื•ืŸ ื”ืชืฉื•ื‘ื” ื”ืœื ื ื›ื•ื ื”

def wrong(message):
    a = f"{question}\\{message.text.lower()}\n"
    with open('dialogues.txt', "a", encoding='utf-8') as f:
        f.write(a)
    bot.send_message(message.from_user.id, "ืขื•ื“ื›ืŸ!")
    update()

๐Ÿ’พ ื›ืืŸ ืื ื—ื ื• ืžืขื“ื›ื ื™ื ืืช ื”ืงื•ื‘ืฅ ื‘ืœื™ื™ื‘, ื•ืžืจืขื ื ื™ื ืืช ื”ืžื•ื“ืœ โ€“ ื›ื›ื” ืฉื”ื‘ื•ื˜ ื‘ืืžืช "ืœื•ืžื“" ื‘ื–ืžืŸ ืืžืช.


ืฉืœื‘ 10: ื”ืคืขืœืช ื”ื‘ื•ื˜

bot.polling(none_stop=True)

ื•ื–ื”ื•! ื”ื‘ื•ื˜ ืžื•ื›ืŸ ืœืคืขื•ืœื”.

Github

ื›ืชื™ื‘ืช ืชื’ื•ื‘ื”

ื”ืื™ืžื™ื™ืœ ืœื ื™ื•ืฆื’ ื‘ืืชืจ. ืฉื“ื•ืช ื”ื—ื•ื‘ื” ืžืกื•ืžื ื™ื *