Node.js 的自然语言处理
作者:Jordan Irabor✏️
介绍
互联网催生了海量非结构化文本数据的不断涌现。幸运的是,我们拥有能够理解此类数据的现代系统。
现代计算机系统可以使用一种名为 NLP(自然语言处理)的底层技术来理解自然语言。该技术可以将人类语言作为输入,并执行以下一项或多项操作:
自然语言处理 (NLP)是语言学、计算机科学、信息工程和人工智能的一个子领域,涉及计算机与人类(自然)语言之间的交互,特别是如何编程计算机来处理和分析大量自然语言数据。
如今,NLP 的大规模应用离我们并不遥远,因为我们的大多数设备都集成了 AI(人工智能)、ML(机器学习)和 NLP,以增强人机通信。以下是一些常见的 NLP 应用示例:
- 搜索引擎:最有用的技术之一是谷歌搜索引擎。你输入文本,就能收到数百万条相关结果。这得益于自然语言处理 (NLP) 技术,它可以理解输入并执行一系列逻辑运算。这也使得谷歌搜索能够理解你的意图,并在你拼写错误的搜索词时提供正确的拼写建议。
- 智能虚拟助手: Siri、Alexa 和Google Assistant等虚拟助手展现了 NLP 实现的先进水平。在收到您的口头输入后,它们可以识别意图、执行操作并以自然语言返回响应。
- 智能聊天机器人:聊天机器人可以分析大量文本数据,并根据大数据及其意图检测能力给出不同的响应。这给人一种自然对话的感觉,而不是与机器的对话。
- 垃圾邮件过滤器:您是否注意到,电子邮件客户端在过滤垃圾邮件方面做得越来越好?这是因为过滤引擎能够理解电子邮件的内容(主要使用贝叶斯垃圾邮件过滤)并判断其是否为垃圾邮件。
上述用例表明,AI、ML 和 NLP 已在网络上得到广泛应用。由于人类使用自然语言与网站交互,我们应该在构建网站时融入 NLP 功能。
当主题是 NLP(或 ML 和 AI)时,Python 通常是首选语言,因为它拥有丰富的语言处理包,例如自然语言工具包 (Natural Language Toolkit )。然而,JavaScript 发展迅速,NPM( Node 包管理器)的存在使其开发人员能够访问大量的包,包括用于执行不同语言的 NLP 的包。
在本文中,我们将重点介绍如何使用 Node 进行 NLP 开发。我们将使用一个名为natural的 JavaScript 库。通过将 natural 库添加到我们的项目中,我们的代码将能够解析、解释、操作和理解用户输入中的自然语言。
本文仅对 NLP 进行了粗略的介绍。对于那些已经在 Python 中使用 NLP 但希望过渡到 Node 实现相同效果的开发者来说,这篇文章将非常实用。即使是完全的新手,也能从中学到很多关于 NLP 技术及其在 Node 中的应用的知识。
先决条件
- Node.js 基础知识
- 为运行Node代码而设置的系统
要按照本文进行编码,您需要创建一个index.js
文件并粘贴您想要尝试的代码片段,然后使用 Node 运行该文件。
让我们开始吧。
安装
我们可以通过运行以下命令来安装 natural:
npm install natural
下一节中每个使用示例的源代码均可在Github上获取。欢迎克隆、分叉或提交问题。
用法
让我们学习如何使用自然语言执行一些基本但重要的 NLP 任务。
标记化
标记化是对输入字符串的各个部分进行划分(并可能进行分类)的过程。生成的标记随后会被传递给其他形式的处理。该过程可以被视为输入解析的子任务。
例如,在文本字符串中:
The quick brown fox jumps over the lazy dog
字符串不会像自然语言使用者那样被隐式地按空格分割。原始输入(43 个字符)必须使用给定的空格分隔符显式拆分为 9 个标记(即匹配字符串
" "
或正则表达式/\s{1}/
)。
Natural内置了一系列智能的分词器算法,可以将文本拆分成一系列的分词数组。以下代码片段展示了 Word 分词器的用法:
// index.js
var natural = require('natural');
var tokenizer = new natural.WordTokenizer();
console.log(tokenizer.tokenize("The quick brown fox jumps over the lazy dog"));
使用 Node 运行该程序将产生以下输出:
[ 'The',
'quick',
'brown',
'fox',
'jumps',
'over',
'the',
'lazy',
'dog' ]
词干提取
词干提取是指将单词还原为词干(也称为基础形式或词根形式)。例如,cats、catlike 和 catty 等单词将被提取为词根——cat。
Natural 目前支持两种词干提取算法——Porter算法和Lancaster (Paice/Husk)。以下是使用 Porter 算法实现词干提取的代码片段:
// index.js
var natural = require('natural');
natural.PorterStemmer.attach();
console.log("I can see that we are going to be friends".tokenizeAndStem());
此示例使用attach()
方法 patchstem()
和tokenizeAndStem()
作为String
的快捷方式PorterStemmer.stem(token)
。tokenizeAndStem()
结果是将文本分解为单个单词,然后返回一个词干标记数组:
[ 'go', 'friend' ]
注:以上结果中,停用词已被算法去除。停用词是在自然语言处理之前过滤掉的词(例如 be、an、to 都是停用词)。
测量单词之间的相似度(字符串距离)
Natural 提供了四种用于计算字符串距离的算法的实现:汉明距离 (Hamming distance)、Jaro-Winkler距离 (Jaro-Winkler) 、Levenshtein 距离 (Levenshtein distance ) 和Dice 系数 (Dice coefficient)。使用这些算法,我们可以判断两个字符串是否匹配。在本项目中,我们将使用汉明距离。
汉明距离通过计算不同字符的数量来测量两个等长字符串之间的距离。第三个参数表示是否忽略大小写。默认情况下,该算法区分大小写。
下面是一个代码片段,展示了使用 Hemming 算法计算字符串距离的方法:
// index.js
var natural = require('natural');
console.log(natural.HammingDistance("karolin", "kathrin", false));
console.log(natural.HammingDistance("karolin", "kerstin", false));
console.log(natural.HammingDistance("short string", "longer string", false));
输出:
3
3
-1
前两次比较返回结果3
是因为有三个字母不同。最后一次比较返回结果-1
是因为被比较的字符串的长度不同。
分类
文本分类(也称为文本标记)是将文本按有组织的类别进行分类的过程。也就是说,如果我们有一个新的未知语句,我们的处理系统可以根据其内容决定它最适合哪个类别。
自动文本分类的一些最常见用例包括:
- 情绪分析
- 主题检测
- 语言检测
Natural 目前支持两种分类器——朴素贝叶斯和逻辑回归。以下示例使用了以下BayesClassifier
类:
// index.js
var natural = require('natural');
var classifier = new natural.BayesClassifier();
classifier.addDocument('i am long qqqq', 'buy');
classifier.addDocument('buy the q\'s', 'buy');
classifier.addDocument('short gold', 'sell');
classifier.addDocument('sell gold', 'sell');
classifier.train();
console.log(classifier.classify('i am short silver'));
console.log(classifier.classify('i am long copper'));
在上面的代码中,我们用示例文本训练了分类器。它将使用合理的默认值对文本进行分词和词干提取。根据示例文本,控制台将输出以下输出:
sell
buy
情绪分析
情绪分析(也称为观点挖掘或情感人工智能)是指利用自然语言处理、文本分析、计算语言学和生物识别技术,系统地识别、提取、量化和研究情感状态和主观信息。情绪分析广泛应用于客户心声材料(例如评论和调查回复)、在线和社交媒体,以及医疗保健材料,涵盖市场营销、客户服务和临床医学等各个领域。
Natural 支持一些算法,可以通过将每个单词的情感倾向相加,并用句子长度进行归一化来计算每段文本的情感倾向。如果出现否定,则结果为负数。
以下是其用法的一个示例:
// index.js
var natural = require('natural');
var Analyzer = natural.SentimentAnalyzer;
var stemmer = natural.PorterStemmer;
var analyzer = new Analyzer("English", stemmer, "afinn");
// getSentiment expects an array of strings
console.log(analyzer.getSentiment(["I", "don't", "want", "to", "play", "with", "you"]));
构造函数有三个参数:
- 语言
- 词干分析器——为了增加情绪分析器的覆盖范围,可以提供词干分析器
- 词汇表- 设置词汇表的类型,
"afinn"
,"senticon"
或"pattern"
是有效值
运行上述代码将得到以下输出:
0.42857142857142855 // indicates a relatively negative statement
语音匹配
使用自然拼读法,我们可以通过语音匹配来比较两个拼写不同但发音相似的单词。以下是使用该metaphone.compare()
方法的示例:
// index.js
var natural = require('natural');
var metaphone = natural.Metaphone;
var soundEx = natural.SoundEx;
var wordA = 'phonetics';
var wordB = 'fonetix';
if (metaphone.compare(wordA, wordB))
console.log('They sound alike!');
// We can also obtain the raw phonetics of a word using process()
console.log(metaphone.process('phonetics'));
我们还使用 获取了单词的原始语音process()
。运行上述代码后,我们得到以下输出:
They sound alike!
FNTKS
拼写检查
用户在通过搜索栏或输入字段向 Web 应用程序输入信息时,可能会出现拼写错误。Natural 有一个概率拼写检查器,可以使用来自文本语料库的一系列标记,针对拼写错误的单词提出更正建议。
为了简单起见,让我们探讨一个使用两个单词的数组(也称为语料库)的示例:
// index.js
var natural = require('natural');
var corpus = ['something', 'soothing'];
var spellcheck = new natural.Spellcheck(corpus);
console.log(spellcheck.getCorrections('soemthing', 1));
console.log(spellcheck.getCorrections('soemthing', 2));
它建议的更正(按概率降序排列)距离输入词的最大编辑距离为1。最大编辑距离为1时,可以覆盖80%到95%的拼写错误。距离超过2后,速度会变得非常慢。
运行代码我们得到以下输出:
[ 'something' ]
[ 'something', 'soothing' ]
结论
以下是我们迄今为止在本文中学到的内容的简要总结:
- 计算机系统日益智能化,能够利用 NLP 从大量非结构化文本数据中提取含义
- Python 拥有丰富的用于执行 AI、ML 和 NLP 任务的智能包,但 JavaScript 发展非常迅速,其包管理器拥有大量能够处理自然语言的包
- Natural 是一个 JavaScript 包,在执行 NLP 操作方面非常强大,并且针对每个任务都提供了多种算法替代方案
下一节中每个使用示例的源代码都可以在 Github 上找到。欢迎克隆、分叉或提交问题。
进一步阅读
通过以下链接查找有关此主题的更多信息:
编者注:觉得这篇文章有什么问题?您可以在这里找到正确版本。
插件:LogRocket,一个用于 Web 应用的 DVR
LogRocket是一款前端日志工具,可让您重播问题,就像它们发生在您自己的浏览器中一样。您无需猜测错误发生的原因,也无需要求用户提供屏幕截图和日志转储,LogRocket 允许您重播会话以快速了解问题所在。它可与任何应用程序完美兼容,无论使用哪种框架,并且提供插件来记录来自 Redux、Vuex 和 @ngrx/store 的更多上下文。
除了记录 Redux 操作和状态之外,LogRocket 还记录控制台日志、JavaScript 错误、堆栈跟踪、带有标头 + 正文的网络请求/响应、浏览器元数据以及自定义日志。它还会对 DOM 进行插桩,以记录页面上的 HTML 和 CSS,即使是最复杂的单页应用程序,也能重现像素完美的视频。
免费试用。
Node.js 的自然语言处理一文首先出现在LogRocket 博客上。
鏂囩珷鏉ユ簮锛�https://dev.to/bnevilleoneill/natural-language-processing-for-node-js-5am9