这种方法对于从网络输入的杂乱数据可能并不完全可靠,因为您可能会发现许多示例文本不符合您的严格规则。您的邮件中有外国字母。但这里有一些基本代码:
将文本拆分成句子(使用后向断言):
message = "A test. Not what I wanted."
sentences = message.split(/(?<=\.)\s*/)
.map(sentence => sentence.trim())
.filter(sentence => sentence)
;
// sentences = ["A test.", "Not what I wanted."]
所有句子都以大写字母开头(加上可选的空格)。如果一个句子缺少句号,那么这个分词器会将两个句子视为一个句子。
is_all_capital = sentences
.map(sentence => sentence.match(/^\s*[A-Z]/))
.every(str => !!str) // cast to boolean
;
消息以句号结束(加上可选的空格)
is_end_period = !!message.match(/\.\s*$/);
没有拼写错误。
注意:这可能会中断,因为您的字典不完整,您的文本语料库包含连字符的单词,不包含撇号,或者标记器弄乱了特殊字符或带有数字的单词。
dictionary = fs.readFileSync('dictionary.txt')
.toLowerCase()
.split('\n')
.reduce((store,x) => ({ ...store, [str]: true }), {})
;
message_tokens = [ ...message.toLowerCase().matchAll(/[a-z]([\w-']*\w)*/g) ]
.filter(match => !!match)
.map(match => match[0] )
;
// message_tokens = ["a", "test", "not", "what", "i", "wanted"]
is_spellchecked = message_tokens.every(token => !!dictionary[str])
如果您对拼写检查很认真,您可能需要研究特定的拼写检查库