需求描述
在某清单应用上,如果我们想要实现用户输入一段文本自动识别用户的时间功能,大部分人会觉得用正则做匹配即可,但其实用正则首先要考虑分词的语法规律,比如要实现:上周三5点一刻,但是用户如果输入上周三一刻5点,很明显这是违背语法规则
的。
对于通用的时间匹配确实可以用正则,首先我们要创建10级权重的关键字、9级权重的关键字...,每个关键词只能匹配更低权重的关键词,如果有更高的关键词我们可以继续累加。注意关键字的组词是很灵活动态的。
比如9级关键词中存在15号(天类型),8级关键词中存在中午,5级关键字存在13点,那么我们可以 15号13点、也可以15号中午。一旦可以动态匹配下级的关键词,意味着要做大量的循环匹配。而且是如此深的层级数组的空间计算复杂度和时间复杂度。
当然还有非常多的细节要实现,比如如果我想要的是一个时间范围而不是某个时刻,我大概想在中午12点到15点来
。那么时间段落和时间段落之间的连接词又要考虑。最终我们需要拿到中午12点和15点的时间戳。
再比如上个月15号的昨天
, 注意这个的
字助词的匹配规则。同时每一个关键词我们都需要定义时间,总的时间会不断累加或减少。
下面我们自行体会下面一些复杂的例子:
大后天晚上15点1分10秒、下午十五分十二秒、上个月15号早上8点、星期四的明天凌晨....
接下来我们聊聊解决方案 NLP:
NLP(natural language processing)
NLP(自然语言处理)是一门研究人类语言和计算机之间交互的领域。它涉及使用计算机算法和技术来理解、解析、生成和处理人类语言。NLP的目标是使计算机能够理解和处理自然语言,从而能够与人类进行自然的交流和理解。
NLP涉及多个任务,包括文本分类、命名实体识别、情感分析、机器翻译、问答系统、语音识别和文本生成等。它结合了计算机科学、人工智能、语言学和心理学等领域的知识和技术
,以实现对人类语言的自动处理和理解。
接下来我们将使用 NLP 自然语言处理在前端实现:
Microsoft.Recognizers.Text
Microsoft.Recognizers.Text库(基于NLP自然语言处理)提供了一系列的识别器(Recognizers),可以用于识别和解析文本中的日期、时间、数字、货币、电话号码、URL、电子邮件地址等实体。它使用NLP技术和模式匹配算法来理解和处理文本,从而提取出其中的结构化信息。
这个库支持多种编程语言,包括C#、Python和JavaScript等。它可以用于各种应用场景,如聊天机器人、语音识别、自然语言理解等,帮助开发者更轻松地处理和分析文本数据。
从 NPM 安装
-- 注意: 软件包的初始版本带有 @preview 标记。--
通过启动以下命令安装所有识别器:
- 在单个模块中获取所有识别器:
npm install @microsoft/recognizers-text-suite
或者,如果希望使用单一类型的识别器:
- 仅获取数字识别器的功能:
npm install @microsoft/recognizers-text-number
- 仅获取具有单位的数字 识别器的功能:
npm install @microsoft/recognizers-text-number-with-unit
- 仅获取日期和时间识别器的功能:
npm install @microsoft/recognizers-text-date-time
- 仅获取序列识别器的功能:
npm install @microsoft/recognizers-text-sequence
- 仅获取选择识别器的功能:
npm install @microsoft/recognizers-text-choice
示例
js
var Recognizers = require('@microsoft/recognizers-text-suite');
var NumberRecognizers = require('@microsoft/recognizers-text-number');
var NumberWithUnitRecognizers = require('@microsoft/recognizers-text-number-with-unit');
var DateTimeRecognizers = require('@microsoft/recognizers-text-date-time');
var SequenceRecognizers = require('@microsoft/recognizers-text-sequence');
var ChoiceRecognizers = require('@microsoft/recognizers-text-choice');
// 方式一
var recognizer = new NumberRecognizers.NumberRecognizer(Recognizers.Culture.English);
var model = recognizer.getNumberModel();
var result = model.parse('Twelve');
// 方式二
var result = Recognizers.recognizeNumber("Twelve", Recognizers.Culture.English)
识别文本日期
js
var Recognizers = require('@microsoft/recognizers-text-suite');
const result = Recognizers.recognizeDateTime("我想要下周三早上9点去某体育馆健身", Recognizers.Culture.Chinese)
console.log(result);
返回的数组内每一项为匹配规则的对象,包含字符开始位置和结束位置,以及解析的时间格式,文本,时间类型。
NLP 的概念和原理
自然语言处理(Natural Language Processing,NLP)的原理是通过计算机科学、人工智能和语言学等领域的方法和技术,使计算机能够理解、处理和生成人类语言。
NLP的原理包括以下几个关键方面:
-
语言理解 :NLP的目标之一是使计算机能够理解人类语言。这涉及到语法、语义和语用等语言学概念的建模和分析。常见的方法包括
词法分析、句法分析、语义角色标注、命名实体识别
等。 -
语言生成 :除了理解语言,NLP也致力于计算机生成自然语言文本。这包括文本摘要、机器翻译、对话系统等任务。生成自然语言需要考虑
语法、语义、连贯性和流畅性
等因素。 -
语言模型 :语言模型是NLP的基础,用于预测和生成语言序列。语言模型可以基于统计方法或者深度学习方法,通过学习语言的统计规律和上下文信息,来计算
下一个单词或字符的概率分布
。 -
语义表示 :NLP需要将自然语言转化为计算机能够理解的形式,即语义表示。这可以是基于逻辑形式、
向量表示(如词嵌入)或者图结构
等形式。语义表示能够捕捉词义、句义和篇章层面的信息。 -
机器学习和深度学习 :NLP中广泛应用了机器学习和深度学习的方法。这些方法可以用于训练语言模型、进行分类、序列标注、机器翻译等任务。深度学习模型如
循环神经网络(RNN)、卷积神经网络(CNN)和Transformer
等在NLP中取得了显著的成果。
而在Microsoft.Recognizers.Text 处理某个明确特征的文本处理,会应用到语言理解的不同解决方案来解析文本结构和语义来知道自己需要什么、然后通过正则表达式来规则匹配获取我想要的数据值。对于复杂并具有拓展性方向多的,我们需要使用机器学习和深度学习。
下面聊聊 GPT 和 NLP 的关系:
GPT 和 NLP
GPT(Generative Pre-trained Transformer)是一种基于 Transformer
架构的语言模型,它在自然语言处理领域取得了巨大的成功。GPT模型通过大规模的预训练来学习语言的统计规律和语义表示,然后可以在各种NLP任务中进行微调或者生成文本。
传统的NLP方法通常基于手工设计的特征和规则,需要大量的人工工作和领域专业知识。而GPT模型通过自主学习,可以从大规模的文本数据中自动学习到丰富的语言知识和表示能力,从而在很多NLP任务上取得了很好的效果。
因此,GPT模型的出现对传统的NLP方法产生了一定的冲击。许多传统的NLP任务,如机器翻译、文本分类、命名实体识别等,都可以通过使用GPT模型进行端到端的训练和预测,无需手动设计特征和规则。这使得NLP研究和应用更加便捷和高效。
因此,虽然GPT模型在NLP领域引起了巨大的关注和影响,但传统的NLP方法仍然有其存在和应用的价值。未来,传统NLP方法和基于深度学习的模型可能会相互结合,共同推动自然语言处理的发展。
总结
一旦项目需求涉及用户输入框输入,输入的文本需要识别时间、数字、金额、温度、年龄等,我们都可以考虑 使用 NLP的Microsoft.Recognizers.Text库在web端应用。比如聊天框 metion 组件、表单、todolist、身份信息识别、情绪分析等。