Найти орфографические ошибки с ЛибреОффисе

Автор Ципихович Эндрю, 7 января 2024, 19:32

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

Ципихович Эндрю

здравствуйте, это макрос Ворда, решил сравнить с тем, какие результаты выдаёт Либра)) и у меня в Ворде при проверке 7000 слов они размещены по одному слову в строке Ворд уходит в нервану
Sub Spelling_Errors ()
Dim wd As Object
For Each wd In ActiveDocument.Range.SpellingErrors
    Debug.Print ";" + wd + "; некорректно"
Next wd
обратился в Питоньяке:
Sub SpellCheckExample 'Листинг 231. SpellCheckExample
 
  Dim s() 'Содержит слова для проверки
  Dim vReturn 'Значение возвращаемое для SpellChecker, Hyphenator и Thesaurus
  Dim i As Integer 'Сервисная индексная переменная
  Dim msg$ 'Строка сообщения
  REM Хотя я создаю пустой массив аргументов, я могу также
  REM использовать Array() для возврата пустого массива.
  Dim emptyArgs() as new com.sun.star.beans.PropertyValue
  Dim aLocale As New com.sun.star.lang.Locale
  'aLocale.Language = "en" 'Использовать Английский язык
  'aLocale.Country = "US" 'Использовать Соединенное королевство как страну
  aLocale.Language = "ru" 'Использовать Русский язык
  aLocale.Country = "RUS" 'Использовать Россию как страну
  REM Слова для проверки орфографии, переносов и тезауруса
  s = Array("hello", "anesthesiologist",_
  "PNEUMONOULTRAMICROSCOPICSILICOVOLCANOCONIOSIS",_
  "Pitonyak", "misspell")
  REM *********Пример проверки орфографии!
  Dim vSpeller As Variant
  vSpeller = createUnoService("com.sun.star.linguistic2.SpellChecker")
  'Используйте vReturn = vSpeller.spell(s, aLocale, emptyArgs())
  'если Вы хотите передавать параметры!
  For i = LBound(s()) To UBound(s())
  vReturn = vSpeller.isValid(s(i), aLocale, emptyArgs())
  msg = msg & vReturn & " для " & s(i) & CHR$(10)
  Next
 
  MsgBox msg, 0, "Проверка орфографии слов"
 
 End Sub
значения:
aLocale.Language = "ru" 'Использовать Русский язык
  aLocale.Country = "RUS" 'Использовать Россию как страну
поставил на авось, авось не прокатило, а как нужно? спасибо

Ципихович Эндрю

и ещё не взлетело:
Dim oDoc As Object
  oDoc = ThisComponent.Text
  s = oDoc.Split(Chr(13))
как загнать в массив то, что на странице со сплитом = абзацу?

bigor

Цитата: Ципихович Эндрю от  7 января 2024, 19:32поставил на авось, авось не прокатило, а как нужно?
зачем авось, если на предыдущей странице таблица с данными для стран. Как вы планируете проверять данные слова по русскому словарю?
Dim oDoc, s
  oDoc = ThisComponent.Text.string
  s = Split(oDoc, Chr(13))
Поддержать наш форум можно здесь

Ципихович Эндрю

спасибо за подсказку, уладил, уж качество завтра посмотрю:
Sub SpellCheckExample 'Листинг 231. SpellCheckExample

  'Dim s() 'Содержит слова для проверки
  's = Array("hello", "anesthesiologist")
  Dim vReturn 'Значение возвращаемое для SpellChecker, Hyphenator и Thesaurus
  Dim i As Integer 'Сервисная индексная переменная
  Dim msg$ 'Строка сообщения
  REM Хотя я создаю пустой массив аргументов, я могу также
  REM использовать Array() для возврата пустого массива.
  Dim emptyArgs() As new com.sun.star.beans.PropertyValue
  Dim aLocale As New com.sun.star.lang.Locale
  'aLocale.Language = "en" 'Использовать Английский язык
  'aLocale.Country = "US" 'Использовать Соединенное королевство как страну
  aLocale.Language = "ru" 'Использовать Русский язык
  aLocale.Country = "RU" 'Использовать Россию как страну
  REM Слова для проверки орфографии, переносов и тезауруса
Dim oDoc, s
  oDoc = ThisComponent.Text.String
  s = Split(oDoc, Chr(13))
  Dim s_i As String
  REM *********Пример проверки орфографии!
  Dim vSpeller As Variant
  vSpeller = createUnoService("com.sun.star.linguistic2.SpellChecker")
  'Используйте vReturn = vSpeller.spell(s, aLocale, emptyArgs())
  'если Вы хотите передавать параметры!
  For i = LBound(s()) To UBound(s())
  s_i = s(i)
  if Left(s_i, 1) = Chr(10) Then s_i = Right(s_i, len(s_i)-1)
  vReturn = vSpeller.isValid(s_i, aLocale, emptyArgs())
  msg = msg & vReturn & "=" & s_i & CHR$(10)
  Next
 
  MsgBox msg, 0, "Проверка орфографии слов"
 
 End Sub

Ципихович Эндрю

опробовал либра 7000 слов за секунду сделала, но все слова выдала как некорректные, я вставил результат либры в ворд и некоторые слова для него корректны, я ничего в коде не напутал?, вот код::
Sub SpellCheckExample 'Листинг 231. SpellCheckExample

    'Dim s() 'Содержит слова для проверки
    's = Array("hello", "anesthesiologist")
   
    Dim dtStart As Date 'Возвращает текущую дату и время как объект Date
    dtStart = Now
    Dim vReturn 'Значение возвращаемое для SpellChecker, Hyphenator и Thesaurus
    Dim i As Integer 'Сервисная индексная переменная
    Dim msg$ 'Строка сообщения
    REM Хотя я создаю пустой массив аргументов, я могу также
    REM использовать Array() для возврата пустого массива.
    Dim emptyArgs() As new com.sun.star.beans.PropertyValue
    Dim aLocale As New com.sun.star.lang.Locale
    'aLocale.Language = "en" 'Использовать Английский язык
    'aLocale.Country = "US" 'Использовать Соединенное королевство как страну
    aLocale.Language = "ru" 'Использовать Русский язык
    aLocale.Country = "RU" 'Использовать Россию как страну
    REM Слова для проверки орфографии, переносов и тезауруса
    Dim oDoc, s
    oDoc = ThisComponent.Text.String
    s = Split(oDoc, Chr(13))
    Dim s_i As String
    REM *********Пример проверки орфографии!
    Dim vSpeller As Variant
    vSpeller = createUnoService("com.sun.star.linguistic2.SpellChecker")
    'Используйте vReturn = vSpeller.spell(s, aLocale, emptyArgs())
    'если Вы хотите передавать параметры!
    For i = LBound(s()) To UBound(s())
        s_i = s(i)
        if Left(s_i, 1) = Chr(10) Then s_i = Right(s_i, len(s_i)-1) 'отбрасываем первый знак
          vReturn = vSpeller.isValid(s_i, aLocale, emptyArgs())
        'msg = msg & vReturn & "=" & s_i & CHR$(10)
        If vReturn = True Then
            msg = msg & ";;" & s_i & "; корректно" & CHR$(13)
        Else
            msg = msg & ";" & s_i & "; некорректно" & CHR$(13)
        End If
    Next
 
    'вывод результата в текущем документе
    ThisComponent.Text.String=msg
   
    Dim dtEnd As Date 'Возвращает текущую дату и время как объект Date
    'dtEnd = Now
   
    MsgBox "Работа макроса завершена" & CHR$(13)  &_
            "Продолжительность выполнения макроса: " & Now - dtStart
 
 End Sub
может в строке If vReturn = True Then нужно If vReturn = "True" Then ???


bigor

нужно If vReturn Then
Словари разные, возможно можно скачать какой расширенный для либры
Поддержать наш форум можно здесь

mikekaganski

Непонятно, в чём цель упражнения. Что Word, что Writer помечают корректные словоформы как некорректные - см. "Яромиру". На скриншоте показаны только фамилии; здесь тестируется только то, какие фамилии есть в словарях. А вообще имена собственные - это совершенно отдельная тема, и как, скажем, может быть годным словарь, если он не знает фамилий таких выдающихся личностей, как я? ;)

Непонятно, что Вас смущает в Вашем собственном коде. На Вашем скриншоте все фамилии имеют подчёркивание как грамматические ошибки в Writer. Разве странно, что и код все из них помечает как ошибки? Вот если бы было наоборот, тогда было бы странно.

Короче, разумно было бы тестировать на наборе из слов, которые точно известны программе ("мама мыла раму") плюс те же слова с ошибками для контроля; а уж потом прогонять произвольные наборы слов.
С уважением,
Михаил Каганский

Ципихович Эндрю

Цитата: mikekaganski от  8 января 2024, 07:24На скриншоте показаны только фамилии;
нет там ни одной фамилии - это 7000 имён
сделал
Цитата: bigor от  7 января 2024, 23:23нужно If vReturn Then
результат тот-же 7000 имён помечены как некорректно

bigor

Цитата: Ципихович Эндрю от  8 января 2024, 08:25результат тот-же
логика не поменялась, просто запись упростилась. Про результат @mikekaganski выше неаписал, все зависит от словарей. Общеупотребительные слова проверяет нормально.
Поддержать наш форум можно здесь