使用 Node.js 进行自然语言处理

本文最后更新于 2023 年 1 月 4 日,以确保所有信息与最新版本的 Node.js 兼容,并添加有关其他 NLP 库的信息,如 NLP.js 和 Compromise.cool。

互联网促进了大量非结构化文本数据的永无止境的创造。如何清除 Mac、iPhone 和 iPad 版 Safari 中的缓存和 Cookie幸运的是,我们拥有可以理解此类数据的现代系统。

现代计算机系统可以使用称为自然语言处理 (NLP)的基础技术来理解自然语言。

Python 通常是 NLP 的首选语言,如何在 Mac、iPhone 和 iPad 上的 Safari 中使用标签组因为它有丰富的语言处理包,如 Natural Language Toolkit。然而,JavaScript 发展迅速,npm 的存在使其开发人员可以访问大量包,包括为不同语言执行 NLP 的包。

在本文中,我们将重点介绍如何使用 Node.js 开始使用 NLP。我们将使用一个名为 natural 的 JavaScript 库。通过将自然库添加到我们的项目中,如何在 Android Auto 和 Apple Carplay 上截屏我们的代码将能够解析、解释、操作和理解来自用户输入的自然语言。

本文几乎不会触及 NLP 的皮毛,但对于已经使用 Python 的 NLP 并希望过渡到使用 Node 实现相同结果的开发人员来说,它会很有用。如何在 iPhone 和 Mac 上的 Pages 应用程序中更改背景颜色完全的新手也将学到很多关于 NLP 作为一种技术及其在 Node.js 中的用法的知识。

跳跃前进:

  • 什么是自然语言处理?

  • 安装自然包

  • 词干提取

  • 波特算法与兰卡斯特算法

  • 衡量单词之间的相似度(字符串距离)

  • 测试分类

  • 情绪分析

  • 拼音匹配

  • 拼写检查

  • 其他 NLP 库

什么是自然语言处理?

自然语言处理技术可以将人类语言作为输入进行处理,并执行以下一项或多项操作:

  • 情绪分析(是正面陈述还是负面陈述?)

  • 主题分类(它是关于什么的?)

  • 根据这个声明决定应该采取什么行动

  • 意图提取(这句话背后的意图是什么?)

NLP 是语言学、计算机科学、信息工程和人工智能的一个子领域,关注计算机与人类(自然)语言之间的交互,特别是如何对计算机进行编程以处理和分析大量自然语言数据。

如今,NLP 的重要实施离我们并不遥远,如何在 iPhone 和 Mac 上的 PowerPoint 中使背景透明因为我们的大多数设备都集成了 AI、ML 和 NLP 以增强人机通信。以下是 NLP 实际应用的一些常见示例。

搜索引擎

最有用的技术之一是 Google 搜索引擎。您输入文本并收到数百万个相关结果作为响应。这是可能的,因为 NLP 技术可以理解输入并执行一系列逻辑操作。如何在 Android 和 iPhone 上从 Google Photos 打印图片这也是让 Google 搜索了解您的意图并在您拼错搜索词时向您建议正确拼写的原因。

智能虚拟助手

Siri、Alexa 和 Google Assistant 等虚拟助手显示了 NLP 实施的先进水平。在收到您的口头输入后,他们可以识别意图、执行操作并以自然语言发回响应。

智能聊天机器人

聊天机器人可以分析大量文本数据,如何在 iPhone 和 Mac 上的 Keynote 中循环播放幻灯片并根据大数据及其检测意图的能力给出不同的响应。这给人一种自然对话而不是机器对话的整体感觉。

垃圾邮件过滤器

您是否注意到电子邮件客户端在从您的收件箱中过滤垃圾邮件方面不断变得更好?这是可能的,因为过滤器引擎可以理解电子邮件的内容——如何在 WhatsApp 上以 GIF 格式发送实时照片主要使用贝叶斯垃圾邮件过滤——并决定它是否是垃圾邮件。

上面的用例表明 AI、ML 和 NLP 已经在网络上大量使用。因为人类使用自然语言与网站交互,所以我们应该构建具有 NLP 功能的网站。

先决条件

  1. Node.js 基础知识

  1. 设置为运行节点代码的系统

要按照本文进行编码,您需要创建一个文件并粘贴您想要尝试的代码片段,然后使用 Node.js 运行该文件。让我们开始!index.js

安装

我们可以通过运行以下命令来安装自然:

npm install natural

GitHub上提供了下一节中每个以下使用示例的源代码。随意克隆它、分叉它或提交问题。

用法

让我们学习如何使用natural执行一些基本但重要的 NLP 任务。

代币化

标记化是将输入字符或单词划分/拆分为称为如何在 iPhone 上将 WhatsApp 音频设置为铃声“标记”的较小部分的过程。标记可以是字符、词或子词。标记化是自然语言处理的第一步,它需要收集数据并将其分解成多个部分,以便机器可以理解它。

例如,让我们看一下文本字符串:The quick brown fox jumps over the lazy dog

字符串不会像自然语言使用者那样在空格中隐式分段。如何关闭 iPhone 中的自动大写原始输入,即 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' ]

词干提取

词干提取是将单词简化为其词干(也称为基词或词根形式)的行为。词干提取是人工智能检索和提取以及语言形态学的一个特征。搜索引擎使用它来索引单词。如何更改与 Apple ID 关联的电话号码例如,cats、catlike 和 catty 等词将被归结为词根 cat。

Natural 目前支持两种词干提取算法:Porter和Lancaster (Paice/Husk)。下面是使用 Porter 算法实现词干提取的代码片段:

// index.js

const natural = require('natural');

console.log(natural.PorterStemmer.tokenizeAndStem("I can see that we are going to be friends"))

从上面的代码中,我们使用波特算法下的方法将字符串分解为单个单词,并将每个单词缩减为基本形式。结果是一组词干标记:tokenizeAndStem()

[ 'go', 'friend' ]
注意 ,在上面的结果中,停用词已被算法删除。停用词是在自然语言处理之前过滤掉的词(例如be、an、to都是停用词)。

波特算法与兰卡斯特算法

波特算法是最著名和最古老的词干提取算法,因为它最不激进。词干相当清晰易懂。Porter stemmer 是一种后缀剥离算法。本质上,它使用预定义的原则将单词分解为最基本的形式。Porter stemmer 使用 50 多个规则,分为五个阶段和几个子步骤,以消除频繁的后缀。

规则的一些例子是:

  • ATOR -> (操作员 -> 操作)

  • SSES -> SS(压迫 -> 压迫)

  • S -> (规则 -> 规则)

  • ION -> (预测 -> 预测)

  • ING -> (going -> go, coming -> come)

另一方面,Lancaster 由于其严密的断词风格而颇具侵略性,令人难以置信。因为词干失去了一些相关性,所以它是最少使用的。Lancaster stemmer 由 100 多条规则组成,大约是 Porter stemmer 的两倍。作者使用与波特的词干提取规则不同的符号来定义规则。每条规则由五个部分组成,其中两个是可选的。

规则的一些例子是:

  • “nois4j>”:用“j”替换结尾的“sion”并再次应用词干分析器

  • “sei3y>”:如果单词以“ies”结尾,则将最后三个字母替换为“y”,然后再次应用词干分析器缩短形式

  • “mu*2.”:如果单词以“um”结尾且单词完整,则去掉最后2个字母并终止

衡量单词之间的相似度(字符串距离)

Natural 提供了四种计算字符串距离的算法实现,Hamming distance,Jaro-Winkler,Levenshtein distance和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

情绪分析

情感分析,也称为意见挖掘或情感 AI,是 NLP 最常用的应用之一,它从口头或书面语言中识别和提取观点以确定一个人的情感。

为了评估一条信息是正面的、负面的还是中性的,可以使用情绪分析。企业使用情绪分析来监控品牌知名度和消费者反馈,以了解产品的表现如何以及增加销售额所需的条件。

Natural 支持的算法可以通过对每个单词的极性求和并用句子的长度对其进行归一化来计算每段文本的情感。如果出现否定,则结果为负。


来自 LogRocket 的更多精彩文章:

  • 不要错过The Replay的精彩瞬间,这是一份来自 LogRocket 的精心策划的时事通讯

  • 了解LogRocket 的 Galileo 如何消除干扰以主动解决应用程序中的问题

  • 使用 React 的 useEffect来优化应用程序的性能

  • 在多个版本的 Node之间切换

  • 了解如何使用AnimXYZ 为您的 React 应用程序制作动画

  • 探索 Tauri,一个用于构建二进制文件的新框架

  • 比较NestJS 与 Express.js


下面是它的用法示例:

// 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 将覆盖 80% 到 95% 的拼写错误。两段距离之后,就变得很慢了。

我们通过运行代码得到以下输出:

[ 'something' ]
[ 'something', 'soothing' ]

其他 NLP 库

自然语言处理.js

NLP.js由 AXA 集团创建,是一个用于机器人开发的 NLP 包,支持 40 种语言。它提供实体提取、情感分析、自动语言识别和其他功能。它是创建聊天机器人的理想 Node.js 库:

const { NlpManager } = require('node-nlp');

const manager = new NlpManager({ languages: ['en'], forceNER: true });

// Adds the utterances and intents for the NLP
manager.addDocument('en', 'bye bye take care', 'greetings.bye');
manager.addDocument('en', 'okay see you later', 'greetings.bye');
manager.addDocument('en', 'hello', 'greetings.hello');
manager.addDocument('en', 'hi', 'greetings.hello');

// Train also the NLG
manager.addAnswer('en', 'greetings.bye', 'Till next time');
manager.addAnswer('en', 'greetings.bye', 'see you soon!');
manager.addAnswer('en', 'greetings.hello', 'Hey there!');
manager.addAnswer('en', 'greetings.hello', 'Greetings!');

// Train and save the model.
(async() => {
    await manager.train();
    manager.save();
    const response = await manager.process('en', 'I should go now');
    console.log(response);
})();

妥协.cool

Compromise.cool是一个非常用户友好的轻量级库。通过将文本转换为数据,它可用于在浏览器中运行 NLP 并得出可靠的结论。妥协仅在英语中起作用。

这是一个简单的代码片段:

import nlp from 'compromise'

var doc = nlp('Sam is coming')
doc.verbs().toNegative()
// 'Sam is not coming'

眨眼

Wink为各种任务提供 NLP 功能,包括增强否定、控制省略、生成 ngram、词干和标记的语音代码。它提供了一组 API,用于处理名称、句子、段落和标记等字符串,每个字符串都表示为一个字符串或单词数组。他们为许多 ML 应用程序执行必要的预处理,包括分类和语义搜索:

// Load wink-nlp-utils
var nlp = require( 'wink-nlp-utils' );

// Extract person's name from a string:
var name = nlp.string.extractPersonsName( 'Dr. Sarah Connor M. Tech., PhD. - AI' );
console.log( name );
// -> 'Sarah Connor'

// Remove stop words:
var t = nlp.tokens.removeWords( [ 'mary', 'had', 'a', 'little', 'lamb' ] );
console.log( t );
// -> [ 'mary', 'little', 'lamb' ]

结论

以下是我们到目前为止在本文中学到的内容的快速总结:

  • 计算机系统变得越来越智能,可以使用 NLP 从大量非结构化文本数据中提取意义

  • Python 拥有大量用于执行 AI、ML 和 NLP 任务的智能包,但 JavaScript 发展非常迅速,其包管理器拥有数量惊人的能够处理自然语言的包

  • Natural,一个 JavaScript 包,在执行 NLP 操作方面非常健壮,并且为每个任务提供了许多算法替代方案

猜你喜欢

转载自blog.csdn.net/weixin_47967031/article/details/129912572
今日推荐