Python 在本地机器上使用拼写检查器?

Python 在本地机器上使用拼写检查器?,python,node.js,string,spell-checking,Python,Node.js,String,Spell Checking,我注意到给定机器(Mac、Linux或Windows)上的常见应用程序都有各自的拼写检查器。从各种IDE到MS Word/Office,再到笔记软件,应有尽有 我试图利用我们各自机器的内置实用程序来分析字符串的语法正确性。似乎我不能只使用机器上的东西,可能需要下载一本字典来比较 我不确定是否有更好的方法来实现这一点。我考虑在本地做一些事情,但我并不反对使用api或curl请求来确定字符串中的单词拼写是否正确 我在看: LanguageTool(hello wrold未能返回错误) 谷歌的tbp

我注意到给定机器(Mac、Linux或Windows)上的常见应用程序都有各自的拼写检查器。从各种IDE到MS Word/Office,再到笔记软件,应有尽有

我试图利用我们各自机器的内置实用程序来分析字符串的语法正确性。似乎我不能只使用机器上的东西,可能需要下载一本字典来比较

我不确定是否有更好的方法来实现这一点。我考虑在本地做一些事情,但我并不反对使用api或curl请求来确定字符串中的单词拼写是否正确

我在看:

  • LanguageTool(hello wrold未能返回错误)
  • 谷歌的tbproxy似乎不起作用
  • Dictionary/Meriam Webster需要api键才能实现自动化
我在查看节点包时注意到了拼写检查器模块,这些模块也封装了单词列表

有没有一种方法可以利用内置的机器词典,或者如果我下载一个词典/词表来进行比较,这是否理想


我认为单词表可能是最好的选择,但我不想重新发明轮子。其他人做了哪些类似的工作?

您的问题被标记为NodeJS和Python。这是特定于NodeJS的部分,但我认为它与python非常相似


Windows(从Windows 8开始)和Mac OS X都有内置的拼写检查引擎

  • Windows:“Windows拼写检查API”是一个C/C++API。要将其与NodeJS一起使用,您需要创建一个绑定
  • Mac OS X:“NSSpellChecker”是AppKit的一部分,用于GUI应用程序。这是一个Objective-CAPI,因此同样需要创建一个绑定
  • Linux:这里没有“特定于操作系统”的API。大多数应用程序使用拼写,但也有其他选择。这也是一个C/C++库,因此需要绑定
幸运的是,已经有一个名为的模块,它具有上述所有功能的绑定。这将使用安装平台的内置系统,但存在多个缺点:

1) 必须生成本机扩展。这一个已经通过node pre gyp完成了二进制文件,但需要为特定平台安装这些文件。如果您在Mac OS X上开发,请运行
npm install
获取软件包,然后在Linux上部署应用程序(使用
node\u modules
-目录),它将无法工作

2) 使用内置拼写检查将使用操作系统指定的默认值,这可能不是您想要的。例如,所使用的语言可能由所选操作系统语言决定。对于UI应用程序(例如,使用Electron构建)来说,这可能很好,但如果您想使用操作系统语言以外的语言进行服务器端拼写检查,则可能会很困难


在基本层面上,拼写检查可以归结为:

  • 标记字符串(例如,通过空格)
  • 根据已知正确单词列表检查每个标记
  • (奖励)收集错误代币的建议,并为用户提供选项
  • 你可以自己写第一部分。第2部分和第3部分需要“已知正确单词列表”或词典。幸运的是,已有一种格式和工具可以使用:

    • 可以使用
      .dic
      -文件
    • 是Hunspell的JS实现,带有自己的字典包
    • 例如,可以在中找到其他词典

    这样,您就可以选择语言,不需要构建/下载任何本机代码,您的应用程序在每个平台上都可以工作。如果您在服务器上进行拼写检查,这可能是您最灵活的选择。

    这项荣誉将由Lukas Knuth承担。我想明确说明如何使用dictionary和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);
    
    这将返回要查看的字符串子集,它们可能拼写错误或误报

    假阳性将表示为:

    • 缩略词
    • 单词的非美式英语变体
    • 未被识别的专有名词,例如一周中的几天和几个月
    • 包含括号的字符串。这一点可以通过删掉单词来补充
    显然,这并不适用于所有情况,但我添加了一个ignore this string函数,如果它包含开发人员希望忽略的特殊单词或短语,您可以利用它


    这意味着要作为节点脚本运行。

    信息量很大。我想这可能会给我一个好的结果。我想要的用例是对json字符串进行自动批量拼写检查。听起来使用nspell可能是一个不错的选择,我们将对此进行更多的研究。理想情况下,我正在尝试创建一个git选通机制来验证我们的字符串文件,因此它将在我们的服务器上。你是否碰巧有一个简单的示例如何给一个数组的话?我将进行研究,以找到实现所列选项之一的明确解决方案/方法如果您使用的是
    nspell
    ,只需重复这些单词,并为每个单词调用
    correct(word)
    。该方法返回一个布尔值,指示单词拼写是否正确。但是,对于你的用例,我认为用任何项目特定的术语制作一个额外的字典可能是有益的,因为基本字典可能会产生很多误报。我会马上给你打勾并竖起大拇指,但我将提交一份答复,明确说明如何处理nspell等问题。