Ejemplo 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
Ejemplo n.º 2
0
class AugChangeGeox(BaseAug):
    """ Аугментация, которая заменяет одни географические названия другими, сохраняя тип топонима """
    def __init__(self):
        with open(os.path.join(FILES_PATH, 'geox.json'), 'r',
                  encoding='utf-8') as geoxs:
            self._geoxs = json.load(geoxs)
        self._morph = pymorphy2.MorphAnalyzer()

    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
        newtext = ' '.join(tokens)
        newtext = remove_whitespace(newtext)
        return newtext
Ejemplo n.º 3
0
 def apply(self, text: str) -> str:
     tokens = self._tokenizer.tokenize(text)[0]
     firstword = self._morph.parse(tokens[0])[0]
     if 'Name' not in firstword.tag and 'Geox' not in firstword.tag:
         tokens[0] = tokens[0].lower()
     newword = random.choice(self._introduction_words_lst)
     count = len(tokens) - 1
     place = random.randint(0, count)
     if tokens[place - 1] not in {'не', 'ни', 'ли'}:
         tokens.insert(place, ',')
         tokens.insert(place, newword)
         if place != 0:
             tokens.insert(place, ',')
     tokens[0] = tokens[0].capitalize()
     newtext = ' '.join(tokens)
     newtext = remove_whitespace(newtext)
     newtext = newtext.replace(',.', '.')
     return newtext
Ejemplo n.º 4
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
Ejemplo n.º 5
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