Успешная ёфикация большого текста

Автор tadaoyamaguchi, 21 июля 2023, 19:09

0 Пользователи и 1 гость просматривают эту тему.

mikekaganski

Мне кажется, просто сохранять список номеров абзацев и символов в них во внутреннем массиве. Всё равно при замене е <-> ё число букв не меняется, индексы не собьются.
С уважением,
Михаил Каганский

sokol92

Я думал, что работа пойдет по следующему сценарию.
На первом этапе поменяем бесспорные слова и проставим закладки для тех, где нужно вмешательство человека.
После этого документ можно сохранить и далее уже человек в своем ритме будет с документом работать (если, например, речь идет о "Войне и мире" Л.Толстого). Обработал группу закладок - удалил.
Плюс - не испортим форматирование "спорных" слов.
Владимир.

mikekaganski

Зачем?
Фактически здесь речь о проверке орфографии. Нигде в текстовых процессорах орфография не исправляется неинтерактивно. Вы можете вообще нигде ничего не сохранять для упрощения кода, а просто делать два прохода. И в диалоге показывать слово (и выделять его в тексте на заднем плане) и спрашивать, менять или нет.
С уважением,
Михаил Каганский

gabix

Цитата: sokol92 от 24 июля 2023, 21:56На первом этапе поменяем бесспорные слова и проставим закладки для тех, где нужно вмешательство человека.

А не проще ли для второго этапа сделать отдельный макрос, запускающий поиск по отдельному словарю спорных случаев?

gabix

К слову, вот код ёфикатора из OOoFBTools:

Option Explicit

Const sConstYoFicationDlg As String = 'YoFicationDlg.txt' ' файл настроек
Public oYoFicationDlg As Object

Private yoFileName As String ' файл с базой ё-слов
Private lDBWordsCount As Long ' число слов в базе
Private oSFA As Object
Private oFS As Object
Private oTIS As Object

Sub YoFicationStart()
'    DialogLibraries.LoadLibrary('OOoFBTools')
    If Not GlobalScope.DialogLibraries.isLibraryLoaded( 'OOoFBTools' ) Then
        GlobalScope.DialogLibraries.LoadLibrary( 'OOoFBTools' )
    End If
    oYoFicationDlg = CreateUnoDialog( GlobalScope.DialogLibraries.OOoFBTools.YoFicationDlg )

    yoFileName = getRootStorage( 'DikBSD.OOoFBTools' ) & '/yo_db/yo.txt'
   
    oSFA    = createUnoService ( 'com.sun.star.ucb.SimpleFileAccess' )
    oFS        = oSFA.openFileRead ( ConvertToURL ( yoFileName ) )
    oTIS    = createUnoService ( 'com.sun.star.io.TextInputStream' )
    oTIS.setInputStream (oFS)
    ' считывание числа замен - число слов базы
    Dim eWord    As String : eWord = oTIS.readLine()
    Dim aWord() As String : aWord = Split(eWord, '|')
    lDBWordsCount = Val( GetNumberFromString( aWord(0) ) )
   
    oYoFicationDlg.Model.Title = 'Ёфикация текста (База данных: ' & lDBWordsCount & ' слов)'
       
    ' только теперь считывание настройки из файла
    Dim nX As Integer, nY As Integer
    ReadDlgSettings( getOOoFBToolsSettingsDir() & sConstYoFicationDlg, oYoFicationDlg, nX, nY )
    oYoFicationDlg.setPosSize( nX, nY, 231, 132, com.sun.star.awt.PosSize.POS )
    VerifyCheckYoOptions()
    oYoFicationDlg.execute()
End Sub

Sub YoFicationCancel()
    oTIS.closeInput()
    oYoFicationDlg.endExecute()
End Sub

' Кнопка запуска обработки доступна только при выборе хотя бы одной опции корректировки
Sub VerifyCheckYoOptions()
    If oYoFicationDlg.getControl( 'cbSmall' ).State    = 0 And oYoFicationDlg.getControl( 'cbCaption' ).State = 0 And oYoFicationDlg.getControl( 'cbStartCaption' ).State = 0 Then
        oYoFicationDlg.getControl( 'cmbtnProcess' ).Enable = False
    Else
        oYoFicationDlg.getControl( 'cmbtnProcess' ).Enable = True
    End If
End Sub

Sub YoFicationtWorking()
    ' записываем настройки диалога
    SaveSettings( getOOoFBToolsSettingsDir() & sConstYoFicationDlg, oYoFicationDlg )
    oYoFicationDlg.endExecute()

    ' считывание числа замен для индикатора прогресса
    Dim eWord    As String, aWord() As String
    Dim dStart            As Date        : dStart            = Now ' время начала обработки
    Dim oDoc            As Object    : oDoc                = ThisComponent
    Dim oReplace        As Object    : oReplace            = oDoc.createReplaceDescriptor
    Dim oProgressBar    As Object    : oProgressBar        = oDoc.CurrentController.StatusIndicator
    Dim lProgressValue    As Long        : lProgressValue    = 0
    Dim lReplaceCount    As Long        : lReplaceCount        = 0
    oProgressBar.start( 'Ёфикация документа:', lDBWordsCount )
   
    With oReplace
        .SearchRegularExpression    = True
        .SearchCaseSensitive        = True
        .SearchWords                = True
'        .SearchAll                    = True
    End With
    Do
        eWord = oTIS.readLine()
        aWord = Split(eWord, '|')
        If aWord(0) <> '' Then
            If oYoFicationDlg.getControl( 'cbSmall' ).State = 1 Then
                ' выполняем замену слов в нижнем регистре
                With oReplace
                    .SearchString    = '\<' & aWord(0) & '\>'
                    .ReplaceString    = aWord(1)
                End With
                lReplaceCount = lReplaceCount + oDoc.ReplaceAll( oReplace )
            End If
               
            If oYoFicationDlg.getControl( 'cbCaption' ).State = 1 Then
                ' выполняем замену слов в ВЕРХНЕМ регистре
                With oReplace
                    .SearchString    = '\<' & UCase( aWord(0) ) & '\>'
                    .ReplaceString    = UCase( aWord(1) )
                End With
                lReplaceCount = lReplaceCount + oDoc.ReplaceAll( oReplace )
            End If
               
            If oYoFicationDlg.getControl( 'cbStartCaption' ).State = 1 Then
                ' выполняем замену Слов, Начинающихся С Заглавной Буквы
                With oReplace
                    .SearchString    = '\<' & UCase( Left( aWord(0), 1 ) ) & Right( aWord(0), Len(aWord(0))-1 ) & '\>'
                    .ReplaceString    = UCase( Left( aWord(1), 1 ) ) & Right( aWord(1), Len(aWord(1))-1 )
                End With
                lReplaceCount = lReplaceCount + oDoc.ReplaceAll( oReplace )
            End If
               
            oProgressBar.setValue( lProgressValue )
            lProgressValue = lProgressValue + 1
        End If
    Loop Until oTIS.isEOF()

    oTIS.closeInput()

    ' время окончания обработки
    Dim dEnd As Date : dEnd = Now
    MsgBox 'Ёфикация документа закончена.' & chr(10) & _
            'Выполнено замен: ' & lReplaceCount  & chr(10) & _
            'Время обработки: ' & TimerOfWorkAsDate( dStart, dEnd ), 64, 'Ёфикация (База данных: ' & lDBWordsCount & ' слов)'
    oProgressBar.End
   
End Sub

mikekaganski

Цитата: gabix от 23 июля 2023, 19:40Посмотрите OOoFBTools, там есть. К сожалению, последняя версия LO, в которой у меня работает это замечательное расширение, — 6.3.4.

Странно, у меня работает на 7.6.0.1.
См. также https://forumooo.ru/index.php?topic=9772 и https://sourceforge.net/p/fbtools/bugs/44/.
С уважением,
Михаил Каганский

gabix

Спасибо! Попробую обновить LO и само расширение (у меня, как оказалось, не самая последняя версия, хотя и, вроде бы, самая последняя, которую сделал ещё Вадим).

sokol92

Спасибо за ссылку на OOoFBTools, грандиозный продукт!

В части ёфикации предусмотрена (если я правильно понимаю) замена в автоматизированном режиме в бесспорных случаях (то есть, в русском языке есть слово с буквой "ё" и нет слова, которое получается из первого заменой "ё" на "е"). Быстродействие вызывает вопросы.

Если приступать к написанию нового кода для ёфикации, то можно обсудить список пожеланий к нему.

  • Код должен в бесспорных случаях в автоматическом режиме осуществлять ёфикацию и деёфикацию.
  • В спорных случаях должен быть организован режим диалога с пользователем. Здесь может быть два режима: а) проверка всех спорных слов и б) проверка спорных слов документа, в которых нет буквы "ё".
  • Типы обрабатываемых документов: текстовые, электронные таблицы, презентации.
  • Область обработки: выделенный фрагмент документа. Если выделение минимально (например, ячейка в Calc), то область обработки может запрашиваться (например, для Calc лист; все листы; все листы, кроме скрытых).
Владимир.

gabix

И даже некоторые спорные случаи могут попасть под автоматическую замену (тут вопрос к авторам исходного перечня слов). Я даже в своё время выловил один и сообщил об ошибке Вадиму, она была исправлена.

tadaoyamaguchi

 ???  прочитал всё, (понял не всё, увы, образования не хватило)
В целом — на стартовый вопрос ответа так и нет, да? Это я правильно понял?

sokol92

Есть ёфикатор из большого пакета OOoFBTools. Он в бесспорных случаях умеет (не быстро) менять в текстовом документе "е" на "ё". Интерактивно, похоже, не работает. Вы можете скачать OOoFBTools, установить и рассказать нам о своих впечатлениях. Ссылки на скачивание Михаил давал выше в #20.

Сейчас мы обсуждаем, стоит ли писать новую программу и если да, то что эта программа должна уметь делать.
Владимир.

tadaoyamaguchi

Цитата: sokol92 от 25 июля 2023, 19:14Вы можете скачать OOoFBTools, установить и рассказать нам о своих впечатлениях.


Спасибо, понятно.

Я нашёл автора вот этого поста https://habr.com/ru/users/3263927/ он дополнил программу работой с форматом docx, но и эта программа пока не может работать интерактивно, спрашивать в неочевидных случаях, увы.
Может быть, он доделает, тогда расскажу тут.

sokol92

Я все-таки не оставляю надежды в ближайшее время написать первую версию программы (когда будет просвет в текущей работе) согласно #22. Еще один режим работы программы - статистика: список слов документа (спорные и бесспорные) и для каждого - количество случаев использования и, в том числе, с буквой "ё".
Владимир.

economist

Немного off-top, но по теме. Ёфикация имеет болезненные побочные эффекты на практике. Ё-слова люди часто не находят, потому что ищут по привычке Е, запомнить это невозможно. Часть ПО просто глючит (старое и даже новое, написанное зарубежными ру-говорящими, не разделяющим "восторга" от данного элемента самоидентичности, либо просто не знающего о масштабах этого явления).

Наконец, всевозможные корпоративные системы часто пасуют перед Ё и сотрудникам Ерёмину и Семёнову уже два года удается избежать снижения KPI и получать больше премии :-) Потому что SQL-запросы написаны без учета тождественности (реальный случай из практики, и не один).

Расплата за внедрёж "Ё" сурова - приходится усложнять запросы, добавлять поля в таблицы с БД без Ё, перестраивать индексы. Это миллионы рублей трудозатрат по стране. Банковские системы в 2000-х также спотыкались на знаке №, люди реально попадали на неустойки из-за непрошедших вовремя платежей. Продолжаются проблемы со знаком параграфа - но мы любим трудности преодолевать.

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

Воинский, пенсионный перс. учеты ждет Ё-кризис. Есть первые штрафы из-за нестыковок отчетности. В стране в год рассматривается более тысячи(!) судебных дел об установлении соответствия ФИО документов с Ё и Е. Других проблем ведь нет.

Что с этим делать бизнес-пользователям LO? Кмк, нужно терпеть, все лишнее отвалится само, спустя годы. Не ё-фицируйете документооборот. Не используйте уродливые длинные тире, потому что они смотрятся некрасиво, хоть и правильно. Следуйте тем нововведениям и правилам, которые не имеют "побочек", мы ведь постоянно их нарушаем.

Могу уверенно сказать что LO Writer оказывает колоссальное влияние на грамотность пользователей, благодаря хорошей проверке орфо- и грамматики. Словарь с Ё в LO для многих из них стал шок-экспириенсом. Подавляющее большинство коллег ушло на обычный словарь. Грамотность не упала, а вот энтропия (хаос) - заметно снизилась.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

mikekaganski

@economist:
Это надуманная проблема. Она не уникальна для русского языка; в большинстве европейских стран, где полно диакритики, такая же ситуация с неоднозначностями - и ничего. В немецком есть "проблема" с ss/ß. И как ни странно, мир не рушится.

Разве что Вы имеете ввиду, что наши разработчики настолько неумелые, что не способны реализовать сравнение без учёта диакритики...
С уважением,
Михаил Каганский