LINUX.ORG.RU

Обработка русских текстов

 


0

1

Надо делить текст на абзацы и йофицировать. Может кто умеет или может направить больше чем на 3 буквы?

Абзацы можно детектить по \n\n и пробелам или табам в начале строки но это не точно.

Словари для йофикации какие то особые есть?


зы Хочу сделать озвучку книг чуть менее ужасной.

★★

Последнее исправление: theurs (всего исправлений: 1)

йофицировать

ChatGPT:

Вы можете использовать следующее правило для замены буквы "е" на букву "ё" в русском тексте, где это соответствует правилам русской орфографии:

Заменить букву "е" на "ё" в случае, если:

1. Буква "е" находится в начальной позиции слова.
2. Буква "е" следует после гласной буквы (а, о, у, э, и, ы) или мягкого знака (ь).
3. Буква "е" следует после шипящих звуков (ж, ч, ш, щ).
4. Буква "е" следует после согласных букв (кроме шипящих) в корнях слов.

Примеры:

- ехать → ёхать
- учение → учёние
- красивый → красивый (остается без изменений, так как буква "е" следует после согласной "с", которая не является шипящей)

Это лишь базовое правило и может быть дополнено для более точной замены, в зависимости от контекста и слова. Пожалуйста, обратите внимание, что в реальной практике следует соблюдать правила русской орфографии и использовать словари или инструменты проверки правописания, чтобы избежать ошибок.
vvn_black ★★★★★
()

Как заменить слова в тексте, только целые слова, игнорируя case

Такой вариант работает только если вокруг слова пробелы, но не точки скобки итп.

text = re.sub(r'\b' + word + r'\b', yo_word, text, flags=re.IGNORECASE)

#!/usr/bin/env python3
## -*- coding: utf-8 -*-


import re


DATA_PATH = "yo.txt"

TEXT = open(DATA_PATH, "r", encoding="utf-8").read().replace('\r', '').split('\n')

DATA = [x.strip() for x in TEXT if x[0] != "*"]
DATA = [x for x in DATA if len(x) > 1]
DATA_CLEANED = [x.replace('ё', 'е') for x in DATA]

# DATA_NOT_SURE = [x.replace("*", "").strip() for x in TEXT if x[0] == "*"]
# DATA_NOT_SURE = [x for x in DATA_NOT_SURE if len(x) > 1]    

# print(len(DATA))
# print(DATA_NOT_SURE[:100])


def yo_text(text: str) -> str:
    """заменяет слова на версии с буквой ё в однозначных случаях"""
    # заменить все символы кроме русских букв на пробелы
    text2 = re.sub(r"[^а-яА-ЯёЁ]+", " ", text)
    # заменить 2 и более пробела на 1
    text2 = re.sub(r"\s+", " ", text)
    for word in text2.split():
        word_lower = word.lower()
        if word_lower in DATA_CLEANED:
            yo_word = DATA[DATA_CLEANED.index(word_lower)]
            # заменить это слово в исходном тексте, менять только слово целиком
            text = re.sub(r'\b' + word + r'\b', yo_word, text, flags=re.IGNORECASE)
    return text


if __name__ == '__main__':
    text = 'Так ты собирался избавиться от тещи? Ну и сволочь!'
    
    print(yo_text(text))

theurs ★★
() автор топика
Ответ на: комментарий от theurs

«««заменяет слова на версии с буквой ё в однозначных случаях»»»

в однозначных случаях

Осмелюсь предположить, что проблема с озвучкой книг проявляется как раз в неоднозначных случаях, то есть так просто не отделаться, придётся брать в рассчёт контекст.

CrX ★★★
()
Последнее исправление: CrX (всего исправлений: 1)
Ответ на: комментарий от CrX

Осмелюсь предположить, что проблема с озвучкой книг проявляется как раз в неоднозначных случаях, то есть так просто не отделаться, придётся брать в рассчёт контекст.

всё так, но и в однозначных случая микрософт и гугол лажает тоже

моя сестренка любит мед - микрософт голос сам ёфицирует только мед а гугол только сестренку Ж)
silero обоих, но в общем зачете он сливает обоим

theurs ★★
() автор топика
Последнее исправление: theurs (всего исправлений: 1)
Ответ на: комментарий от theurs

Мед — не однозначный случай. Может она в меде (медицинском вузе) учится и любит учёбу. Слово, конечно, разговорное, но достаточно употребимое.

CrX ★★★
()
Ответ на: комментарий от ComradeDOS

NLTK?

токенайзер?

['него', '(', 'тещу', ')', '.', '–', 'Ага', '!', '–', 'злорадно', 'усмехнулась', 'Кива.', '–', 'Так', 'ты', 'собирался', 'избавиться', 'от', 'тещи', '?', 'Ну', 'и', 'сволочь', '!']

разбивает на слова и прочие символы, но при этом полностью теряет всю инфу о пробелах и переносах. как реконструировать текст после замены слов

theurs ★★
() автор топика
Ответ на: комментарий от theurs

ошибка была тут text2 = re.sub(r"\s+", " ", text)

и дальше всё посыпалось

надо было text2 = re.sub(r"\s+", " ", text2)


а регэксп работает нормально

theurs ★★
() автор топика
Последнее исправление: theurs (всего исправлений: 1)

А есть способ заменить в тексте все числа на слова, и сокращения на слова как они читаются? Тогда можно будет использовать голоса от silero, они звучат как живые, когда не путают ударение Ж)

Ваше место №10 -> Ваше место номер десять.


Я пытался но получилось хреново. Удалось сделать даже транслитерацию по словарю так что бы trade-in превращалось в трэйд-ин вместо траде-ин.

Но согласование чисел и особенно сокращения всё испортили.

theurs ★★
() автор топика