Использование Spell Checker на локальной машине? - PullRequest
0 голосов
/ 28 декабря 2018

Я заметил, что обычные приложения на данном компьютере (Mac, Linux или Windows) имеют соответствующие средства проверки орфографии.Все, от различных IDE, до MS Word / Office и программного обеспечения для создания заметок.

Я пытаюсь использовать встроенную утилиту наших соответствующих машин для анализа синтаксической корректности строк.Кажется, я не могу просто использовать то, что есть на компьютере, и мне, вероятно, придется скачать словарь, в котором можно сравнить.

Я не был уверен, что есть лучший способ сделать это.Я пытался сделать что-то локально, но я не был против выполнения запросов api или curl для определения правильности написания слов в строке.

Я смотрел:

  • LanguageTool ( hello wrold не удалось вернуть ошибку)
  • Кажется, что tbproxy от Google не работает
  • Для словаря / Meriam-Webster требуются ключи API для автоматизации.

Я просматривал пакеты Node и заметил модули проверки орфографии, которые также инкапсулируют списки слов.

Есть ли способ вообще использовать встроенные машинные словари, или это было бы идеально?Если я загружу словарь / список слов для сравнения?

Я думаю, что список слов мог бы быть лучшим выбором, но я не хотел изобретать велосипед.Что другие сделали, чтобы сделать подобное?

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

Кредит идет к Лукасу Кнуту.Я хочу дать подробное описание использования словаря и nspell.

Установка Следующие 2 зависимости:

npm install nspell dictionary-en-us

Вот пример файла, который я написал для решения проблемы.

// Node File

//  node spellcheck.js [path]
//  path: [optional] either absolute or local path from pwd/cwd

//  if you run the file from within Seg.Ui.Frontend/ it works as well.
//    node utility/spellcheck.js
//  OR from the utility directory using a path:
//    node spellcheck.js ../src/assets/i18n/en.json

var fs = require("fs");
var dictionary = require("dictionary-en-us");
var nspell = require("nspell");
var process = require("process");
// path to use if not defined.
var path = "src/assets/i18n/en.json"

let strings = [];
function getStrings(json){
    let keys = Object.keys(json);
    for (let idx of keys){
        let val = json[idx];
        if (isObject(val)) getStrings(val);
        if (isString(val)) strings.push(val)
    }
}

function sanitizeStrings(strArr){
    let set = new Set();
    for (let sentence of strArr){
        sentence.split(" ").forEach(word => {
            word = word.trim().toLowerCase();
            if (word.endsWith(".") || word.endsWith(":") || word.endsWith(",")) word = word.slice(0, -1);
            if (ignoreThisString(word)) return;
            if (word == "") return;
            if (isNumber(word)) return;
            set.add(word)
        });
    }
    return [ ...set ];
}

function ignoreThisString(word){
    // we need to ignore special cased strings, such as items with
    //  Brackets, Mustaches, Question Marks, Single Quotes, Double Quotes
    let regex = new RegExp(/[\{\}\[\]\'\"\?]/, "gi");
    return regex.test(word);
}

function spellcheck(err, dict){
    if (err) throw err;
    var spell = nspell(dict);
    let misspelled_words = strings.filter( word => {
        return !spell.correct(word)
    });
    misspelled_words.forEach( word => console.log(`Plausible Misspelled Word: ${word}`))
    return misspelled_words;
}

function isObject(obj) { return obj instanceof Object }
function isString(obj) { return typeof obj === "string" }
function isNumber(obj) { return !!parseInt(obj, 10)}

function main(args){
    //node file.js path
    if (args.length >= 3) path = args[2]
    if (!fs.existsSync(path)) {
        console.log(`The path does not exist: ${process.cwd()}/${path}`);
        return;
    }
    var content = fs.readFileSync(path)
    var json = JSON.parse(content);
    getStrings(json);
    // console.log(`String Array (length: ${strings.length}): ${strings}`)
    strings = sanitizeStrings(strings);
    console.log(`String Array (length: ${strings.length}): ${strings}\n\n`)

    dictionary(spellcheck);
}
main(process.argv);

Это вернет подмножество строк для просмотра, и они могут быть с ошибками или ложными срабатываниями.

Ложный положительный результат будет обозначен как:

  • Аббревиатура
  • варианты, отличные от английского, для слов
  • Неизвестные имена собственные, например, дни недели и месяцы.
  • Строки, содержащие скобки.Это можно дополнить, обрезав их по слову.

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

Он предназначен для запуска в качестве сценария узла.

0 голосов
/ 29 декабря 2018

Ваш вопрос помечен как NodeJS и Python.Это специфическая часть NodeJS, но я думаю, что она очень похожа на python.


Windows (начиная с Windows 8 и Mac OS X) имеют встроенные механизмы проверки орфографии.

  • Windows: «Windows Spell Checking API» - это C / C ++ API.Чтобы использовать его с NodeJS, вам нужно создать привязку.
  • Mac OS X: «NSSpellChecker» является частью AppKit, используемой для приложений с графическим интерфейсом.Это API-интерфейс Objective-C, поэтому вам снова потребуется создать привязку.
  • Linux: здесь нет "API для конкретной ОС".Большинство приложений используют Hunspell, но есть альтернативы.Это снова библиотека C / C ++, поэтому необходимы привязки.

К счастью, уже существует модуль под названием spellchecker , который имеет привязки для всего вышеперечисленного.При этом будет использоваться встроенная система для платформы, на которой она установлена, но есть несколько недостатков:

1) Должны быть собраны собственные расширения.На этом закончены двоичные файлы через node-pre-gyp, но они должны быть установлены для определенных платформ.Если вы разрабатываете в Mac OS X, запустите npm install, чтобы получить пакет, а затем разверните свое приложение в Linux (с каталогом node_modules), оно не будет работать.

2) Использование build-при проверке орфографии будут использоваться настройки по умолчанию, установленные ОС, что может не соответствовать вашим ожиданиям.Например, используемый язык может быть продиктован выбранным языком ОС.Для приложения пользовательского интерфейса (например, сборки с Electron) это может быть хорошо, но если вы хотите выполнять проверку орфографии на стороне сервера на языках, отличных от языка ОС, это может оказаться затруднительным.


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

  1. Токенизация строки (например, пробелами)
  2. Проверка каждого токена на соответствие списку известных правильных слов
  3. (Бонус) Собирайте предложения по неверным токенам и предлагайте пользователю варианты.

Вы можете написать часть 1 самостоятельно.Часть 2 и 3 требуют «список известных правильных слов» или словарь.К счастью, есть формат и инструменты для работы с ним:

  • simple-spellchecker может работать с .dic -файлами.
  • nspell - это JS-реализация Hunspell с собственными пакетами словарей.
  • Дополнительные словари можно найти, например, в этом репозитории

СТаким образом, вы можете выбрать язык, вам не нужно создавать / загружать какой-либо нативный код, и ваше приложение будет работать одинаково на всех платформах.Если вы проверяете орфографию на сервере, это может быть вашим наиболее гибким вариантом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...