Esempio n. 1
0
 def apply(self, text: str):
     tokens = self._tokenizer.tokenize(text)[0]
     n_tokens = len(tokens)
     r1 = random.randint(0, n_tokens - 1)
     r2 = random.randint(0, n_tokens - 1)
     word1 = tokens[r1]
     word2 = tokens[r2]
     while word1 == word2:
         r1 = random.randint(0, n_tokens - 1)
         word1 = tokens[r1]
     word1, s1 = remove_punctuation_with_sign(word1)
     word2, s2 = remove_punctuation_with_sign(word2)
     if word1.istitle() or word2.istitle():
         firstword = self._morph.parse(word1)[0]
         if 'Name' not in firstword.tag and 'Geox' not in firstword.tag:
             word1 = word1.lower()
         secondword = self._morph.parse(word2)[0]
         if 'Name' not in secondword.tag and 'Geox' not in secondword.tag:
             word2 = word2.lower()
     tokens[r1] = word2 + s1
     tokens[r2] = word1 + s2
     tokens[0] = tokens[0].capitalize()
     newtext = ' '.join(tokens)
     newtext = remove_whitespace(newtext)
     return newtext
Esempio n. 2
0
 def apply(self, text: str):
     tokens = text.split(' ')
     for i, token in enumerate(tokens):
         token, s = remove_punctuation_with_sign(token)
         if token.isdigit():
             c = len(token) - 1
             if c == 0:
                 a = 0
             else:
                 a = int('1' + '0' * c)
             b = int('9' + '9' * c)
             n = random.randint(a, b)
             if i + 1 >= len(tokens):
                 word = tokens[i - 1]
                 word_id = i - 1
             else:
                 word = tokens[i + 1]
                 word_id = i + 1
             word, s2 = remove_punctuation_with_sign(word)
             is_title = True if word.istitle() else False
             # процесс согласования
             word_0 = self._morph.parse(word)[0]
             ww = word_0.normal_form
             word_0 = self._morph.parse(ww)[0]
             if 'NOUN' in word_0.tag:
                 if str(n).endswith('11') or str(n).endswith('12') or str(
                         n).endswith('13') or str(n).endswith('14'):
                     if 'Sgtm' not in word_0.tag:
                         word_0 = word_0.inflect({'plur'})
                     word_0 = word_0.inflect({'gent'})
                     new_form = word_0.word
                 else:
                     if n % 10 == 1:
                         word_0 = word_0.inflect({'nomn'})
                         new_form = word_0.word
                     elif n % 10 in {2, 3, 4}:
                         word_0 = word_0.inflect({'gent'})
                         new_form = word_0.word
                     else:
                         if 'Sgtm' not in word_0.tag:
                             word_0 = word_0.inflect({'plur'})
                         word_0 = word_0.inflect({'gent'})
                         new_form = word_0.word
             else:
                 new_form = word
             if is_title:
                 new_form = new_form.capitalize()
             tokens[i] = str(n) + s
             tokens[word_id] = new_form + s2
     text = ' '.join(tokens)
     return text
Esempio n. 3
0
 def apply(self, text: str) -> str:
     tokens = text.split(' ')
     for token in tokens:
         s_starts = ''
         s_ends = ''
         s = ''
         token, s = remove_punctuation_with_sign(token)
         token, s_starts, s_ends = remove_quote(token)
         # ищем слово с заглавной буквы
         if token.istitle():
             # проверяем, является найденное слово географическим названием
             firstword = self._morph.parse(token)[0]
             if 'Geox' in firstword.tag:
                 newword = token
                 # запоминаем исходный падеж
                 case = firstword.tag.case
                 # для поиска слова в списке геогр.названием выбирапм форму Им.Падежа и пишем ей с заглавной буквы
                 checkword = firstword.normal_form.capitalize()
                 # проверяем, каким типом топонимов является слово
                 for geo_type, names in self._geoxs.items():
                     if checkword in names:
                         newword = random.choice(names)
                         break
                 # если в словаре не нашлось такого географического названия, то мы его пропускаем
                 if newword == token:
                     continue
                 # загружаем новое слово в pymorphy, чтобы получить нужную форму
                 secondword = self._morph.parse(newword)[0]
                 # проверяем "совместимость" предлога
                 previous_token_index = tokens.index(s_starts + token +
                                                     s_ends + s)
                 if tokens[previous_token_index - 1].lower() in ['в', 'во']:
                     case = 'loct'
                     reg = re.compile("^[В|Ф][^аоуэиыяеёю]")
                     result = re.match(reg, newword)
                     prword = tokens[previous_token_index - 1]
                     if result != None:
                         prword = prword + 'о'
                     else:
                         prword = prword[:1]
                     tokens[previous_token_index - 1] = prword
                     # выбираем нужную форму слова и меняем первую букву слова на заглавную
                 newword1 = s_starts + secondword.inflect(
                     {case}).word.capitalize() + s_ends + s
                 # заменяем старое слово на новое
                 n = previous_token_index
                 tokens[n] = newword1
Esempio n. 4
0
    def apply(self, text: str) -> str:
        tokens = text.split(" ")
        for i, token in enumerate(tokens):
            token, s = remove_punctuation_with_sign(token)
            firstword = self._morph.parse(token)[0]
            case = firstword.tag.case
            if 'Name' in firstword.tag:
                newname = token
                if 'ms-f' in firstword.tag:
                    newname = random.choice(self._names_lst)
                if 'femn' in firstword.tag:
                    newname = random.choice(self._fems_names_lst)
                elif 'masc' in firstword.tag:
                    newname = random.choice(self._masc_names_lst)
                newname2 = self._morph.parse(newname)[0]

                # выбираем нужную форму слова и меняем первую букву слова на заглавную
                newname3 = newname2.inflect({case}).word.capitalize() + s
                tokens[i] = newname3
        newtext = ' '.join(tokens)
        return newtext
Esempio n. 5
0
 def apply(self, text: str) -> str:
     tokens = self._tokenizer.tokenize(text)[0]
     tokens = text.split(" ")
     for token in tokens:
         # если есть знак препинания, то убираем его из слова с которым будем работать
         oldword = token
         s = ''
         token, s = remove_punctuation_with_sign(token)
         # ищем аббревиатуру в тексте
         if token in self._abbs:
             newwords = self._abbs[token]
             # проверяем корректность падежа
             oldword_index = tokens.index(oldword)
             prword = tokens[oldword_index - 1].lower()
             # если предыдущее слово это союз, то нужно посмотреть, что было перед союзом
             if prword in {'и', 'или'}:
                 prword = tokens[oldword_index - 2]
                 # если перед союзом ещё одна аббревиатура (расшифрованная в ходе программы или нет), то
                 # выбираем падеж исходя из того, что стоит перед аббревиатурой
                 if prword.isupper() or ' ' in prword:
                     prword = tokens[oldword_index - 3].lower()
             prword_case = self._check_case(prword)
             newwordss = newwords.split(" ")
             newwlst = []
             # склоняем слова
             for w in newwordss:
                 ww = self._morph.parse(w)[0]
                 if ww.tag.case == 'nomn':
                     newword = ww.inflect({prword_case}).word
                 else:
                     newword = w
                 if w.istitle():
                     newwlst.append(newword.capitalize())
                 else:
                     newwlst.append(newword)
             newword1 = " ".join(newwlst)
             tokens[oldword_index] = newword1 + s
     newtext = " ".join(tokens)
     newtext = remove_whitespace(newtext)
     return newtext
Esempio n. 6
0
 def apply(self, text: str) -> str:
     # делим текст на отдельные слова
     tokens = self._tokenizer.tokenize(text)[0]
     for i, token in enumerate(tokens):
         # ищем союз "и"
         if token == 'и':
             try:
             # запоминаем слово до союза и после
                 word1 = tokens[i - 1]
                 word2 = tokens[i + 1]
             except IndexError:
                 return text
             word2, s = remove_punctuation_with_sign(word2)
             firstword = self._morph.parse(word1)[0]
             secondword = self._morph.parse(word2)[0]
             # если слова - прилагательные, то меняем их местами
             if 'ADJF' in firstword.tag and 'ADJF' in secondword.tag:
                 tokens[i - 1] = word2.lower()
                 tokens[i + 1] = word1.lower() + s
     # уточняем, что предолжение начинается с заглавной буквы
     tokens[0] = tokens[0].capitalize()
     newtext = ' '.join(tokens)
     newtext = remove_whitespace(newtext)
     return newtext