Example #1
0
def fixTxtIfNeed(txt):
    arr = utils.str2arr(txt)
    for w in arr:
        if (not utils.getStartForm(w) in utils.dictionw):
            logD("Ask Ya.Speller...")
            return utils.checkText(txt)
    return txt
 def getAnswerByDial(self,
                     arr):  #Нет ничего более постоянного, чем временное...
     txt = arr[-1].lower()
     txt = txt.replace("курису", "").replace("макисе", "").replace(
         "макисэ", "").replace("амадей",
                               "").replace("amadeus",
                                           "").replace("амадеус", "")
     txtarr = utils.str2arr(txt)
     if (("что лучше" in txt) or ("лучше" in txtarr and "или" in txtarr)):
         t1, t2 = getVibor(txt)
         if (t1 > 0.2): return t1, t2
     if ((("го" in txtarr) or ("кинь" in txtarr) or ("пришли" in txtarr) or
          ("отправь" in txtarr)) and ("цитату" in txtarr)
             and ("баш" in txt or "bash" in txt)):
         return 0.9, getBashorg()
     if ((("го" in txtarr) or ("кинь" in txtarr) or ("пришли" in txtarr) or
          ("отправь" in txtarr)) and ("цитату" in txtarr)):
         return 0.9, getRandquote()
     if (txt == "цитату"): return 0.7, getRandquote()
     if (("посоветуй" in txt or "порекомендуй" in txt or "подскажи" in txt
          or "кинь" in txt)
             and ("аниме" in txtarr or "анимцо" in txtarr
                  or "анимэ" in txtarr or "anime" in txtarr)):
         return 0.9, getRandAnime()
     if ("какое" in txtarr and "аниме" in txtarr
             and ("посмотреть" in txtarr or "глянуть" in txtarr)):
         return 0.9, getRandAnime()
     if (("кинь" in txt or "отправь" in txt or "пришли" in txt
          or "го" in txtarr)
             and ("кошкодев" in txt or "некочан" in txt or "некотян" in txt
                  or "с кошачьеми уш" in txt or "с кошачьими уш" in txt)):
         return 0.9, getNekochan()
     try:
         if ("arxiv.org" in txt): return 0.8, getArxivArticle(txt)
         if (" стать" in txt and "arxiv" in txt):
             return 0.85, getArxivArticle(txt)
         if (" стать" in txt and (" архива" in txt or " архиве" in txt)):
             return 0.85, getArxivArticle(txt)
         if ("най" in txt and "arxiv" in txt):
             return 0.85, getArxivArticle(txt)
         if ("най" in txt and "архиве" in txt):
             return 0.85, getArxivArticle(txt)
     except Exception as e:
         logD(e)
     if (("кинь" in txtarr or "отправь" in txtarr or "пришли" in txtarr
          or "покажи" in txtarr or "го" in txtarr) and
         ("себя" in txtarr or "свою фот" in txt or "селфи" in txtarr
          or "сэлфи" in txtarr or "себяшку" in txtarr or "с собой" in txt)):
         return 0.7, getKurisuArt()
     #		if():return 0.85,getMedicalArticle(txt)
     try:
         return getAnswerFromKnowledger(
             txt.replace("что ты думаешь о", "что такое"),
             utils.getMainTheme(" ".join(arr)), arr[-2])
     except Exception as e:
         logD(e)
     return 0, ""
Example #3
0
def getArxivArticle(txt):  #Статья с arxiv.org по поисковому запросу
    txtarr = utils.str2arr(txt)
    q = ""
    for i in txtarr:
        if (i.count("arxiv") + i.count("кинь") + i.count("най") +
                i.count("пожалуйста") + i.count("плиз") + i.count("мне") +
                i.count("го") + i.count("стат") + i.count("архив") +
                i.count("ишли") + i.count("отправь") == 0):
            q += i + " "
    return getArxiv0(q[:-1])  #TODO: fix it
def getVibor(txt):  #Выбрать один вариант из нескольких, TODO: доработать
    txt = txt.replace("Тру, ", "").replace("Амадей", "").replace(
        "Кристина",
        "").replace("Курису",
                    "").replace("Тру,",
                                "")  #Если вопрос к Тру, то тоже отвечаем
    txt = txt.replace("как думаешь",
                      "").replace("что лучше",
                                  "").replace("Как думаешь",
                                              "").replace("Что лучше", "")
    if (len(txt) < 3 or txt.lower().count(" или ") == 0):
        return 0.1, ""
    txtarr = utils.str2arr(
        txt[:2] + txt[2:].replace(", ", " или ").replace(",", " или "))
    if (txtarr.count("или") == 0):
        return 0.1, ""
    txtarrarr = [""]
    for i in txtarr:
        if (i == "или"):
            txtarrarr.append("")
        else:
            txtarrarr[-1] += i + " "
    semloads = []
    for i in txtarrarr:
        semloads.append(utils.getSemanticLoad(i))
    minn = min(semloads)
    mini = semloads.index(minn)
    semloads[mini] = 10
    minn2 = min(semloads)
    ans = txtarrarr[mini][:-1]
    cov = abs(minn - minn2) / (minn + minn2 + 1e-6)
    if (cov > 0.9):
        ans = random.choice([
            "Очень сложно, но думаю, что ",
            "Очень сложно, но мне кажется, что ",
            "Сложно/pauseМне кажется, что "
        ]) + ans
    elif (cov > 0.6):
        ans = random.choice(
            ["Сложно, но думаю, что ", "Сложно, но мне кажется, что "]) + ans
    elif (cov > 0.3):
        ans = random.choice(["Мне кажется, что ", "Думаю, что "]) + ans
    elif (cov > 0.2):
        ans = random.choice(["Я считаю, что ", "Моё мнение: ", ""]) + ans
    else:
        ans = random.choice([
            "Очевидно, что ", "Очевидно же, что ", "Ясно, что ",
            "Это же очевидно!/pause", "А что думать?/pause"
        ]) + ans
    return 1 - cov / 9, ans
Example #5
0
 def __init__(self, s):  #Из строки с нуля
     global reglink
     if (type(s) == str):
         self.orig = s
         if (len(self.orig) > 0 and self.orig[-1] == '\n'):
             self.orig = self.orig[:-1]
         self.words = [].copy()
         self.tokenizedwords = [].copy()
         arr = utils.str2arr(s)
         links = re.findall(reglink, s)
         for i in arr:
             d = {}
             tmpl = ""
             for link in links:
                 if (link.count(i) > 0):
                     tmpl = link
                     break
             if (tmpl != ""):  #Для ссылок несколько иная обработка
                 d['word'] = tmpl
                 d['startform'] = tmpl
                 d['root'] = tmpl
                 d['semload'] = utils.getSemanticLoad_low(tmpl)
                 d['syns'] = ""
                 self.words.append(d)
                 continue
             d['word'] = i
             d['startform'] = utils.getStartForm(i)
             inf = utils.wordInfo(i)
             d['root'] = inf['root']
             d['semload'] = utils.getSemanticLoad_low(i)
             if (inf['parts'].count('|гл|') > 0): d['semload'] *= 1.1
             if (inf['parts'].count('|мест|') + inf['parts'].count('|числ|')
                     > 0):
                 d['semload'] *= 0.9
             d['syns'] = inf['syns']
             self.words.append(d)
     elif (type(s) == dict):  #Из сохранённого
         self.orig = s['orig']
         if (len(self.orig) > 0 and self.orig[-1] == '\n'):
             self.orig = self.orig[:-1]
         self.words = s['words']
     else:
         print("Invalid constructor object")
Example #6
0
    def getAnswerByDial(self, arr):  #Для совместимости с адаптерами
        cmd = arr[-1].lower()
        if (cmd.count("/pause") > 0):
            cmd = cmd.split("/pause")[-1].replace("/pause", "")
#		print("Assist:",cmd)
        score = 0
        warr = utils.str2arr(cmd)
        if (warr[0] in [
                "курису", "амадей", "amadeus", "амадеус", "ассистент",
                "кристина"
        ]):
            warr.pop(0)
        if (warr[0].count("включи") + warr[1].count("музык") > 1):
            try:
                pth = os.path.expanduser("~/Музыка") + "/"  #TODO: English
                fls = os.listdir(pth)
                priors = []
                for i in fls:
                    tmpi = i.lower()
                    if (tmpi.count("stein") + tmpi.count("takeshi") +
                            tmpi.count("s;g") + tmpi.count("штейн") > 0):
                        priors.append(i)  #Штайнера и Штайна игнорим. Не канон.
                cmd = "vlc --open"  # --random"
                for i in priors:  #Сначала воспроизводим относящееся к тематике Калитки
                    cmd += " \"" + pth + i + "\""
                for i in fls:
                    cmd += " \"" + pth + i + "\""
                os.system(cmd + " 2>&1 &")
                return 0.9, "Выполнено!"
            except Exception as e:
                print(e)
        if ("определител" in cmd and "матриц" in cmd):
            try:
                m = utils.bashExec("xclip -o")
                m = m.replace("{", "[").replace("}", "]").replace("\n", "")
                D = np.linalg.det(eval(m))
                return 0.9, "Определитель равен " + str(fractions.Fraction(D))
            except Exception as e:
                print(e)
                return 0.7, "Произошла ошибка " + utils.entoru(str(e))
        if ("собствен" in cmd and "значения" in cmd and "матриц" in cmd):
            try:
                m = utils.bashExec("xclip -o")
                m = m.replace("{", "[").replace("}", "]").replace("\n", "")
                eigvals = np.linalg.eig(eval(m))[0]
                print(eigvals)
                res = ""
                for i in range(len(eigvals)):
                    res += str(fractions.Fraction(eigvals[i])) + ", "
                return 0.9, "Собственные значения " + res[:-2]
            except Exception as e:
                print(e)
                return 0.7, "Произошла ошибка " + utils.entoru(str(e))
        if ("собствен" in cmd and "вектор" in cmd and "матриц" in cmd):
            try:
                m = utils.bashExec("xclip -o")
                m = m.replace("{", "[").replace("}", "]").replace("\n", "")
                m = Matrix(eval(m))
                vects = m.eigenvects()
                res = ""
                for v in vects:
                    val = str(v[0])
                    vv = str(v[2]).replace("[",
                                           "").replace("]",
                                                       "").replace("\n",
                                                                   "")[6:]
                    res += "/pause Значение " + val + " - " + vv
                '''eigvals,eigvect=np.linalg.eig(eval(m))
				print(eigvals,eigvect)
				res=""
				zeros=[0 for x in range(len(eigvals))]
				for i in range(len(eigvals)):
					res+="Значение "+str(fractions.Fraction(eigvals[i]))+" - ["
					curvect=zeros.copy()
					curvect[i]=1
					curvect=eigvect.dot(curvect)
					curvect/=min(curvect)
					for j in range(len(curvect)):res+=str(fractions.Fraction(curvect[j]))+", "
					res=res[:-2]+'],'''
                return 0.9, "Собственные вектора " + res
            except Exception as e:
                print(e)
                return 0.7, "Произошла ошибка " + utils.entoru(str(e))
        return 0, ""
def getAnswerFromKnowledger(
        txt, context,
        lastmsg):  #Получить ответ из Интернета (Лурк и Вики вместе)
    ismat = False  ######## АХТУНГ! МНОГО МАТА И ИНДУССКОГО КОДА! ПЕРЕД ИЗУЧЕНИЕМ СЕСТЬ И ВЫПИТЬ УСПОКОИТЕЛЬНОГО
    txt = txt.replace("Тру, ", "").replace(
        "Тру,", ""
    )  #Вот сейчас серьёзно. Не стоит вскрывать эту функцию, вы молодые, шутливые...
    if (len(txt) < 3):
        return 0.1, ""
    txtarr = utils.str2arr(txt)
    lastmsgarr = []
    try:
        lastmsgarr = utils.str2arr(lastmsg)
    except:
        pass
    for i in [
            'хуй', 'залупа', 'пенис', 'пепка', 'пеп', 'пизда', 'пиздец', 'бля',
            'блять', 'блядь', 'заебись', 'ебу', 'хуя', 'кек'
    ]:
        if (i in lastmsgarr or i in txtarr or i in context):
            ismat = True
            break
    res = ""
    if ("что" in txtarr and "это" in txtarr and len(txtarr) == 2):
        try:
            inp = context[-1]
            if (len(inp) < 5):
                inp = context[-2]
            if (utils.getSemanticLoad(inp) < 0.2):
                lastmsgsems = []
                for i in lastmsgarr:
                    lastmsgsems.append(utils.getSemanticLoad(i))
                inp = lastmsgarr[lastmsgsems.index(max(lastmsgsems))]
            if (ismat):
                res = getLurkAnswer(inp)
                if (len(res) < 3):
                    res = getWikipediaAnswer(inp)
            else:
                res = getWikipediaAnswer(inp)
                if (len(res) < 3):
                    res = getLurkAnswer(inp)
        except Exception as e:
            logD(e)
    if (len(res) > 3):
        return 0.9, res
    if ("что" in txtarr and "такое" in txtarr):
        inp = ""
        for i in txtarr:
            if (i != "что" and i != "такое"):
                inp += i + " "
        if (ismat):
            res = getLurkAnswer(inp)
            if (len(res) < 3):
                res = getWikipediaAnswer(inp)
        else:
            res = getWikipediaAnswer(inp)
            if (len(res) < 3):
                res = getLurkAnswer(inp)
    if (len(res) > 3):
        return 0.9, res
    if ("что" in txtarr and "значит" in txtarr):
        inp = ""
        for i in txtarr:
            if (i != "что" and i != "значит"):
                inp += i + " "
        if (ismat):
            res = getLurkAnswer(inp)
            if (len(res) < 3):
                res = getWikipediaAnswer(inp)
        else:
            res = getWikipediaAnswer(inp)
            if (len(res) < 3):
                res = getLurkAnswer(inp)
    if (len(res) > 3):
        return 0.9, res
    if ("что" in txtarr and "есть" in txtarr):
        inp = ""
        for i in txtarr:
            if (i != "что" and i != "есть"):
                inp += i + " "
        if (ismat):
            res = getLurkAnswer(inp)
            if (len(res) < 3):
                res = getWikipediaAnswer(inp)
        else:
            res = getWikipediaAnswer(inp)
            if (len(res) < 3):
                res = getLurkAnswer(inp)
    if (len(res) > 3):
        return 0.9, res
    if ("поясни" in txtarr and "за" in txtarr):
        inp = ""
        for i in txtarr:
            if (i != "поясни" and i != "за"):
                inp += i + " "
        if (ismat):
            res = getLurkAnswer(inp)
            if (len(res) < 3):
                res = getWikipediaAnswer(inp)
        else:
            res = getWikipediaAnswer(inp)
            if (len(res) < 3):
                res = getLurkAnswer(inp)
    if (len(res) > 3):
        return 0.9, res
    if ("кто" in txtarr and "такой" in txtarr):
        inp = ""
        for i in txtarr:
            if (i != "кто" and i != "такой"):
                inp += i + " "
        if (ismat):
            res = getLurkAnswer(inp)
            if (len(res) < 3):
                res = getWikipediaAnswer(inp)
        else:
            res = getWikipediaAnswer(inp)
            if (len(res) < 3):
                res = getLurkAnswer(inp)
    if (len(res) > 3):
        return 0.9, res
    if ("что" in txtarr and "будет" in txtarr and "если" in txtarr):
        res = thequest(txt)
        if (res.count("<theq-answer") > 0):
            res = res[:res.index("<theq-answer")]
        if (len(res) < 3):
            res = otvetMailRu(inp)
        res = res.replace("<strong>", "").replace("</strong>", "").replace(
            "<i>", "").replace("</i>", "").replace("</span>", "").replace(
                "<a href=\"", "").replace("target=\"_blank\"",
                                          "").replace("</a>", "")
    if (len(res) > 3):
        return 0.6, res
    if (int("кто" in txtarr) + int("что" in txtarr) + 2 *
        (txt.count("проинтегрир") + txt.count("продифференц")) +
            txt.count("зна") + txt[-2:].count("?") > 1):
        try:
            res = getWolframRU(txt)
        except Exception as e:
            logD(e)
    if (len(res) > 3):
        return 0.4, res
    return 0.1, "Я не знаю"