示例#1
0
 def test_locale(self):
     ad = AlphabetDetector()
     faker = Faker('ru_RU')
     seeder = Seeder(faker)
     seeder.add_entity(Game, 5)
     seeder.execute()
     self.assertTrue(all([ad.is_cyrillic(game.title) for game in Game.objects.all()]))
    def __freqs_dict(self, raw_text):

        t_start = time()
        print('Making filtered text...')

        stopset = set(stopwords.words('russian'))
        ad = AlphabetDetector()

        tokens = word_tokenize(raw_text)
        tokens_filtered = [w.lower() for w in tokens
                           if w not in stopset
                           and w not in self.__custom_stopwords
                           and w.isalpha()
                           and len(w) >= self.__min_word_len
                           and ad.is_cyrillic(w)]


        freqs_tokenized_text = FreqDist(tokens_filtered)
        freqs_most_common = OrderedDict(freqs_tokenized_text.most_common(self.__max_words))

        res_text = ''
        for item in freqs_most_common.items():
            word = item[0]
            freq = item[1]
            for i in range(freq):
                res_text += word + ' '

        t_end = time()
        print("TIME = %.2f s" % (t_end - t_start))

        return res_text
示例#3
0
def handle_text(message):
    alert_new_user(message)
    ad = AlphabetDetector()

    if '*' in message.text:
        bot.send_message(message.chat.id,
                         'Я не знаю такого символа * . Введите запрос заново.',
                         parse_mode='Markdown')

    elif ad.is_cyrillic(message.text) == False and ad.is_hebrew(
            message.text) == False:
        answer = 'Извините, я еще не знаю глагола "*' + message.text + '*".\nВозможно вы ввели текст на неизвестном мне языке.\nЯ понимаю Русский и עברית. Попробуй снова.'
        bot.send_message(message.chat.id, answer, parse_mode='Markdown')
        log(message, answer)

    elif ad.is_cyrillic(message.text) == True:  # на кириллице
        status_searching = 'Ответа в файле нет.'
        mes = message.text
        mes = mes.lower()  # Все буквы меняем на мленькие
        mes = mes.split(',')  # разделяем по запятой смс-запрос
        id_maybe_answer_links = []
        tx_maybe_answer_links = []
        id_answer_links = [
        ]  #Это нужный список, туда будем добавлять, все верное.
        for one_word in mes:
            one_word = one_word.lstrip(
            )  # убрали пробелы вначале текста в смс-запросе
            for row in range(
                    2, 4307
            ):  # Открываем каждую строку поочереди начиная со третей строки (шапку не читаем). Сейчас строк всего 4310.
                if one_word in list.row(
                        row
                )[3].value:  # Если значение в столбце под индексом 3 (толбец с переводом), соответствует переменной mes, то
                    id_maybe_answer_links.append(int(list.row(
                        row)[2].value))  #добавляет его id в список возможных

                    # --------------это можно куда-то перенести в другое место
                    tx_maybe_answer_links.append(
                        list.row(row)[4].value + '- ' + list.row(row)[3].value
                    )  # тут составили текст, который будет отображаться на кнопке
                    if len(tx_maybe_answer_links[-1]) > 35:
                        print('Знаков на кнопке больше 35 - ',
                              tx_maybe_answer_links[-1])
                    # --------------это можно куда-то перенести в другое место

                    ru_trans = list.row(row)[3].value.split(
                        ',')  # разделяем по запятой значения с ответами
                    sum_verbs_in_the_row = 0  # Тут будем считать сколько подходящих нам слов в этой строке. Пока - 0.
                    for word in ru_trans:
                        word = word.lstrip(
                        )  # убрали пробелы вначале текста в строке
                        if word[0:len(
                                one_word
                        )] == one_word and sum_verbs_in_the_row == 0:  # если первые символы каждого слова(слово имеется ввиду, текст между запятыми) равны смс-запросу. И это первая проверка в строке, то
                            id_answer_links.append(
                                int(list.row(row)[2].value)
                            )  #добавляем id перевода который, точно подходит. Верный перевод.
                            sum_verbs_in_the_row += 1  # Увеличиваем счетчик слов в строке на 1
        # Сначала определим есть ли подходящие ответы. Если нет, то тогда предоставим примерные ответы по запросу.
        if len(id_answer_links) != 0:
            id_maybe_answer_links = id_answer_links  #если подходящие ответы есть, то дальше будем делать все манипуляции с этим списком ответов
            status_searching = 'Ответ в файле есть.'
        if len(id_maybe_answer_links) == 1:
            row = int(constants1.table_start) + int(
                id_maybe_answer_links[0]
            )  #constants1.table_start - это начало таблицы. помогает быстро найти строку в таблиуе. Для поска прибавляем эту констунту к id глагола
            # ниже определяем, печатать ли в ответе дополнительные кнопки с пассивной формой
            if str(list.row(int(row))[179].value) != "":
                key = make_batton_imper(message, str(row), add_buttons="all")
            else:
                key = make_batton_imper(message, str(row), add_buttons="imper")
            answer = send_table(
                message, row,
                kind_of_table="short")  # тут срабатывет функция send_table
            bot.send_message(
                message.chat.id,
                answer,
                reply_markup=key,
                parse_mode='Markdown',
                disable_web_page_preview=True
            )  # disable_web_page_preview=True - это для того, чтоб сниппет не отправлялся
            log(message, send_table(message, row, kind_of_table="short"))
        elif len(id_maybe_answer_links) > 1:
            namber_bort = 1
            key = make_battons(message, id_maybe_answer_links,
                               status_searching, int(namber_bort))
            if status_searching == 'Ответа в файле нет.':
                answer_for_report = 'Извините, я еще не знаю этого глагола. Возможно вы искали(борт-' + str(
                    namber_bort) + ':\n-' + str(id_maybe_answer_links) + '\n'
                answer = "Извините, я еще не знаю этого глагола. Возможно вы искали:"
            elif status_searching == 'Ответ в файле есть.':
                answer_for_report = 'Есть несколько подходящих ответов(борт-' + str(
                    namber_bort) + ':\n-' + str(id_maybe_answer_links) + '\n'
                answer = "Есть несколько подходящих ответов:"
            bot.send_message(message.chat.id, text=answer, reply_markup=key)
            log(message, answer_for_report)

        else:  # если нет ответов совсем
            answer = 'Извините, я еще не знаю глагола "*' + message.text + '*"\n_Если Вы считаете, что он важен, отправь этот глагол на проверку. И я проверю его очень быстро._Так же Вы можете проверить Ваш запрос, возможно в слове есть очепятки.'
            key = telebot.types.InlineKeyboardMarkup()
            but = telebot.types.InlineKeyboardButton(text='Отправить глагол.',
                                                     callback_data='88888888')
            key.add(but)
            bot.send_message(message.chat.id,
                             answer,
                             parse_mode='Markdown',
                             reply_markup=key)
            log(message, answer)

    elif ad.is_hebrew(
            message.text
    ) == True:  # если завпрос на иврите. Тут буду искть только точное совпадение.
        if ',' in message.text:
            answer = 'Вы написали несколько слов через запятую ",". Я могу найти только один глагол за 1 раз. Попробуй снова сделать запрос.'
            bot.send_message(message.chat.id, answer, parse_mode='Markdown')
            log(message, answer)
        else:
            mes = message.text
            mes = mes.strip()  # убрали пробелы вначале и вконце текста
            status_searching = 'Ответа в файле нет.'  # это возможно можно убрать
            id_maybe_answer_links = []
            id_answer_links = [
            ]  # Это нужный список, туда будем добавлять, все верное.
            for row in constants1.rows_verbs_bin5:  # Открываем каждую строку поочереди начиная со третей строки (шапку не читаем). Сейчас строк всего 4310.
                if str(mes) in str(
                        list.row(row)[int(180)].value
                ):  #если похожее слово в ячейке и ранее мф еще не нашли других похожих слов в этой строке, то...
                    if list.row(row)[2].value not in id_maybe_answer_links:
                        id_maybe_answer_links.append(
                            int(list.row(row)[2].value)
                        )  #добавляет его id в список возможных
                    verb_all_forms = list.row(row)[180].value.split(
                        ',')  # разделяем по запятой значения с ответами
                    for word in verb_all_forms:
                        word = word.strip("~")  # убрали лишние символы
                        word = word.strip(
                        )  # убрали пробелы вначале и вконце текста в каждом слове
                        if word == mes:  # если первые символы каждой формы слова(слово имеется ввиду, текст между запятыми) равны смс-запросу. И это первая проверка в строке, то
                            if list.row(row)[2].value not in id_answer_links:
                                id_answer_links.append(
                                    int(list.row(row)[2].value)
                                )  # добавляем id перевода который, точно подходит. Верный перевод.

            if len(id_answer_links) == 0:
                answer = "Извините, нет ни одного глагола ни в одном спряжении ни в одном времени в таком написании - " + mes + ".\nВозможно в слове есть опечатка. Сделайте запрос снова."
                bot.send_message(message.chat.id,
                                 answer,
                                 parse_mode='Markdown')  #, #reply_markup=key)
                log(message, answer)

            elif len(id_answer_links) == 1:
                row = int(id_answer_links[0]) + constants1.table_start
                if str(list.row(int(row))[179].value) != "":
                    key = make_batton_imper(message,
                                            str(row),
                                            add_buttons="all")
                else:
                    key = make_batton_imper(message,
                                            str(row),
                                            add_buttons="imper")
                answer = send_table(
                    message, row,
                    kind_of_table="short")  # тут срабатывет функция send_table
                bot.send_message(
                    message.chat.id,
                    answer,
                    reply_markup=key,
                    parse_mode='Markdown',
                    disable_web_page_preview=True
                )  # disable_web_page_preview=True - это для того, чтоб сниппет не отправлялся
                log(message, send_table(message, row, kind_of_table="short"))
            else:
                status_searching = 'Ответ в файле есть.'  #убрать
                id_maybe_answer_links = id_answer_links
                key = telebot.types.InlineKeyboardMarkup()
                for one_id in id_maybe_answer_links:
                    call_data = str(one_id)
                    row = int(one_id + constants1.table_start)
                    text = mes + "- " + str(list.row(row)[int(3)].value)
                    but = telebot.types.InlineKeyboardButton(
                        text=text, callback_data=call_data)
                    key.add(but)
                answer = "Вот, что удалось найти в базе знаний:"
                bot.send_message(message.chat.id,
                                 answer,
                                 parse_mode='Markdown',
                                 reply_markup=key)
                log(message, answer)