Простая проверка терминологии

Я ищу простой инструмент, который бы проверял текст на терминологию на основе списка замены.

Пример замены определения:

  • разрешено: приложение
  • запрещено: приложение; рассмотреть: приложение
  • запрещено: программа; рассмотреть: приложение
  • разрешено: бонусная программа
  • запрещены: программа вознаграждений; учтите: бонусная программа

Пример текста:

Наше приложение поддерживает программу вознаграждений.

Выводы:

ошибка: ошибка приложения
: программа вознаграждений

Предлагаемый текст:

Наше приложение поддерживает бонусную программу.

Не находит:

ошибка: программа

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

Требования:

  • простое редактирование списка замен с помощью бесплатных инструментов или Microsoft Office
  • машиночитаемый формат списка замен, чтобы мы могли писать инструменты, поддерживающие рабочий процесс
  • работать в Windows
  • бесплатно / с открытым исходным кодом
  • находит ошибки, как описано выше
  • выделение цветом
    • красный: ошибка
    • зеленый: признанный термин
    • Я ищу какой-то отчет, а не модификацию исходного файла. Это может быть временный отчет, отображаемый на экране. Не надо спасаться.
  • делает предложения, как описано выше
  • если применимо несколько предложений, позвольте пользователю выбрать, какое из них принять

Я уже пробовал:

  • TermXAct (немецкий), но а) он коммерческий и б) не предпочитает длинные термины коротким и в) не является полным
«Выделение цветом» — вы запрашиваете выходной документ (отчет) с этим выделением или изменение исходного документа для использования этого выделения?
@Kodiologist: спасибо за вопрос. Я ищу какой-нибудь отчет. Это может быть временный отчет, отображаемый на экране. Не надо спасаться.

Ответы (1)

Вот как это сделать в Python 3. Эта программа имеет все запрошенные функции, кроме выделения цветом, потому что консоль Win32 поддерживает цвет только с момента обновления Threshold 2 для Windows 10. Большая часть сложности программы связана с обработкой случая из нескольких предложений.

 import sys, re, collections

 context_size = 30

 defs_path, doc_path = sys.argv[1:]

 defs = collections.defaultdict(list)
 with open(defs_path, 'rt') as o:
     for l in o:
         bad, _, good = l.strip().partition(' -> ')
         defs[bad].append(good)

 with open(doc_path, 'rt') as o:
     doc = o.read()

 def replacement_f(m):
     print('\nerror:', m.group())
     candidates = defs[m.group()]
     if len(candidates) == 1:
         print('Replacing with:', candidates[0])
         return candidates[0]
     print('There are multiple possible replacements.')
     print('Context:', re.sub(r'\s+', ' ', doc[
         max(m.start() - context_size, 0) :
         min(m.start() + context_size, len(doc))]))
     print('Candidates:', dict(enumerate(candidates)))
     while True:
        n = input('Enter a number: ')
        if n.isdigit() and int(n) < len(candidates):
            return candidates[int(n)]
 doc = re.sub(
     '|'.join(re.escape(bad) for bad in
         sorted(defs.keys(), key = len, reverse = True)),
     replacement_f,
     doc)

 print('\nResult:\n')
 print(doc)

Теперь предположим, что у вас есть такой файл defs.txt:

app -> application
program -> application
bounty program -> bonus program
supports -> can use
supports -> has support for

и такой файл input.txt:

Our app supports the bounty program.

Если программа Python называется script.py, вы можете запустить ее с помощью команды:

python3 script.py defs.txt input.txt

Результат выглядит следующим образом:

error: app
Replacing with: application

error: supports
There are multiple possible replacements.
Context: Our app supports the bounty program. 
Candidates: {0: 'can use', 1: 'has support for'}
Enter a number: 0

error: bounty program
Replacing with: bonus program

Result:

Our application can use the bonus program.
Вау, я знал, что это не так сложно реализовать, но я удивлен, насколько коротким он может быть на самом деле. Я на тренировке в течение следующих 3 дней. Я попробую решение, когда вернусь в офис,