Python 在本地机器上使用拼写检查器?
我注意到给定机器(Mac、Linux或Windows)上的常见应用程序都有各自的拼写检查器。从各种IDE到MS Word/Office,再到笔记软件,应有尽有 我试图利用我们各自机器的内置实用程序来分析字符串的语法正确性。似乎我不能只使用机器上的东西,可能需要下载一本字典来比较 我不确定是否有更好的方法来实现这一点。我考虑在本地做一些事情,但我并不反对使用api或curl请求来确定字符串中的单词拼写是否正确 我在看: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
- 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++库,因此需要绑定
npm install
获取软件包,然后在Linux上部署应用程序(使用node\u modules
-目录),它将无法工作
2) 使用内置拼写检查将使用操作系统指定的默认值,这可能不是您想要的。例如,所使用的语言可能由所选操作系统语言决定。对于UI应用程序(例如,使用Electron构建)来说,这可能很好,但如果您想使用操作系统语言以外的语言进行服务器端拼写检查,则可能会很困难
在基本层面上,拼写检查可以归结为:
- 可以使用
-文件.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);
这将返回要查看的字符串子集,它们可能拼写错误或误报
假阳性将表示为:
- 缩略词
- 单词的非美式英语变体
- 未被识别的专有名词,例如一周中的几天和几个月
- 包含括号的字符串。这一点可以通过删掉单词来补充
这意味着要作为节点脚本运行。信息量很大。我想这可能会给我一个好的结果。我想要的用例是对json字符串进行自动批量拼写检查。听起来使用nspell可能是一个不错的选择,我们将对此进行更多的研究。理想情况下,我正在尝试创建一个git选通机制来验证我们的字符串文件,因此它将在我们的服务器上。你是否碰巧有一个简单的示例如何给一个数组的话?我将进行研究,以找到实现所列选项之一的明确解决方案/方法如果您使用的是
nspell
,只需重复这些单词,并为每个单词调用correct(word)
。该方法返回一个布尔值,指示单词拼写是否正确。但是,对于你的用例,我认为用任何项目特定的术语制作一个额外的字典可能是有益的,因为基本字典可能会产生很多误报。我会马上给你打勾并竖起大拇指,但我将提交一份答复,明确说明如何处理nspell等问题。