尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

ML-For-Beginners 课程实战:NLP 常见任务与 TextBlob 情感感知聊天机器人构建指南

ML-For-Beginners 课程实战:NLP 常见任务与 TextBlob 情感感知聊天机器人构建指南 ML-For-Beginners 课程实战NLP 常见任务与 TextBlob 情感感知聊天机器人构建指南【免费下载链接】ML-For-Beginners12 weeks, 26 lessons, 52 quizzes, classic Machine Learning for all项目地址: https://gitcode.com/GitHub_Trending/ml/ML-For-Beginners自然语言处理NLP任务的核心是先把待处理的文本分解、检查再与规则和数据集交叉比对从而让程序推导出文本中词与短语的含义、意图或频率。本文对应 ML-For-Beginners 课程 NLP 单元的第二课 6-NLP/2-Tasks原文为西班牙语翻译版系统讲解分词、词嵌入、句法解析、词频统计、n-gram、名词短语抽取、情感分析等 NLP 基础技术并结合仓库中的 参考实现 bot.py带你用 TextBlob 把上一课只会随机应答的 Marvin 机器人升级为能感知情绪、能围绕名词短语追问的共情聊天机器人。学完本课你将掌握 NLP 预处理的标准任务清单并能独立完成一次情感分析 名词短语抽取的端到端编码实践。NLP 任务的通用套路先拆解再分析对大多数自然语言处理任务而言待处理的文本必须被分解broken down、检查examined结果要么被存储要么与规则和数据集交叉引用。正是这一系列任务让程序员得以从文本中推导出词与术语的含义meaning、意图intent或者仅仅只是频率frequency。这些技术一旦与机器学习结合就能高效分析海量文本。但在把 ML 应用到这些任务之前理解 NLP 工程师所面对的问题本身同样重要。通常这些任务会按照固定的先后顺序依次执行——下面逐一介绍。Tokenization分词绝大多数 NLP 算法的第一步都是把文本切分成tokens词元也就是一个个单词。听起来简单但要处理标点符号、不同语言各自的词与句分隔符就会变得棘手——你可能需要借助多种方法才能确定词的边界。对《傲慢与偏见》中的句子进行分词。Infografía por Jen Looper例如图中把句子 Angry people are not always wise. 逐个单词高亮拆开每个单词成为一个 token供下游任务使用。分词是词性标注、情感分析、机器翻译等一切需要单词级输入的 NLP 流水线的基础。Embeddings词嵌入词嵌入Word embeddings是把文本数据转换为数值的一种方式。嵌入的构造方式使得语义相近的词、或经常一起出现的词会在向量空间中聚拢成群。I have the highest respect for your nerves, they are my old friends. —— 来自《傲慢与偏见》一句话的词嵌入。Infografía por Jen Looper图中每个单词I, have, respect, the, highest...被映射为向量语义关联的词如 respect 连接 highest 与 nerves在向量空间中距离更近。这种分布式表示是文本分类、命名实体识别、问答系统等需要语义理解任务的基础。可以用 TensorFlow 的 Embedding Projector 之类的工具亲自体验点击一个单词就会显示出相似词的聚类例如 toy玩具会和 disney、lego、playstation、console 聚在一起。Parsing 与词性标注Part-of-Speech Tagging每个被分词后的单词都可以被标注为一种词性part of speech——名词、动词或形容词。例如句子el rápido zorro rojo saltó sobre el perro marrón perezoso敏捷的红狐狸跳过懒棕狗可以被标注为zorro狐狸 名词saltó跳过 动词。对《傲慢与偏见》中的句子进行解析。Infografía por Jen Looper图中对句子 Elizabeth was too much embarrassed to say a word. 的每个成分都标上了语法类别Elizabeth 专有名词Proper noun、was 动词verb、too much 形容词修饰语mod. adj.、embarrassed 形容词adjective、to say 动词不定式v. infinitive、a word 名词noun。而Parsing句法解析则是识别句子中哪些词彼此相关例如el rápido zorro rojo saltó是一个形容词-名词-动词序列与后面的el perro marrón perezoso序列相分离。机器很擅长套用形式化规则这也是为什么像人一样解析句子对计算机来说并不难——真正的难点在于理解句子的含义与情感。词与短语频率Word and Phrase Frequencies分析大段文本时一个非常实用的操作是为每一个感兴趣的词或短语构建词典dictionary记录它出现了多少次。例如the quick red fox jumped over the lazy brown dog中the的词频是 2。看一个真实示例。Rudyard Kipling 的诗《The Winners》中有这样一节What the moral? Who rides may read. When the night is thick and the tracks are blind A friend at a pinch is a friend, indeed, But a fool to wait for the laggard behind. Down to Gehenna or up to the Throne, He travels the fastest who travels alone.短语频率统计可以根据需要区分大小写或不区分大小写这首诗中短语a friend的频率是 2the的频率是 6travels的频率是 2。N-gramsN 元组文本可以按固定长度切分成词的序列一个词叫unigram一元组两个词叫bigrams二元组三个词叫trigrams三元组任意 n 个词统称n-grams。例如el rápido zorro rojo saltó sobre el perro marrón perezoso以 n2 切分得到如下二元组el rápidorápido zorrozorro rojorojo saltósaltó sobresobre elel perroperro marrónmarrón perezoso把它想象成在句子上滑动的盒子会更直观。以下是 n3 的滑动窗口每句中加粗下划线的部分就是该三元组el rápido zorrosaltó sobre el perro marrón perezosoelrápido zorro rojosaltó sobre el perro marrón perezosoel rápidozorro rojo saltósobre el perro marrón perezosoel rápido zorrorojo saltó sobreel perro marrón perezosoel rápido zorro rojosaltó sobre elperro marrón perezosoel rápido zorro rojo saltósobre el perromarrón perezosoel rápido zorro rojo saltó sobreel perro marrónperezosoel rápido zorro rojo saltó sobre elperro marrón perezoson-gram 值为 3 时的滑动窗口效果。Infografía por Jen Loopern-gram 用于捕捉局部上下文信息是拼写检查、文本生成、关键词提取和统计语言模型如根据前 n-1 个词预测下一个词等任务的基础特征。名词短语抽取Noun Phrase Extraction大多数句子中都有一个作为主语或宾语的名词。在英语里它前面往往有 a、an 或 the 这样的冠词。通过**抽取名词短语noun phrase extraction**来识别句子的主语或宾语是 NLP 中理解句子含义时的常见任务。✅ 在句子 I cannot fix on the hour, or the spot, or the look or the words, which laid the foundation. It is too long ago. I was in the middle before I knew that I had begun. 中你能找出名词短语吗以el rápido zorro rojo saltó sobre el perro marrón perezoso为例这里共有 2 个名词短语rápido zorro rojo红狐狸和perro marrón perezoso懒棕狗。情感分析Sentiment Analysis一个句子或文本可以被分析出情感sentiment即它有多积极或多消极。情感通过两个维度衡量极性polarity与客观性/主观性objectivity/subjectivity。极性polarity取值范围 -1.0 到 1.0从消极到积极客观性objectivity取值范围 0.0 到 1.0从最客观到最主观。✅ 后面你会学到用机器学习判断情感的多种方法其中一种朴素做法是由人类专家准备一份被归类为积极或消极的词与短语清单再把这个模型应用到文本上计算极性得分。想一想这种方法在哪些场景下会奏效在哪些场景下效果不佳例如反讽、幽默、上下文反转等场景就很难处理。屈折与词形还原处理词的形态变化Inflection屈折变化让你拿到一个词后得到它的单数或复数形式例如 cat → cats、mouse → mice。这是英语等语言的形态学核心机制。Lemmatization词形还原lemma词元是一组词的根或主词形例如voló飞了、vuela飞、volando飞着的词元都是动词volar飞。词形还原把各种屈折形式归并到词典中的基本形便于后续统计与检索。实用资源WordNet 词汇数据库NLP 研究者还有可用的现成数据库其中特别值得一提WordNet是一个词库数据库收录了多种语言中每个词的近义词、反义词以及大量其他细节。在构建翻译系统、拼写检查器或任何类型的语言工具时它都极其有用。NLP 库为什么你不必从零实现幸运的是你不需要亲手实现上述所有技术——Python 生态中有出色的现成库让不专精于 NLP 或 ML 的开发者也能轻松上手。后续课程会给出更多示例本课先掌握几个马上要用到的实用技巧。练习使用 TextBlob 库本课选用TextBlob因为它包含了处理这类任务的实用 API。TextBlob 站在 NLTK 和 pattern 的巨人肩膀上并与两者良好协作其 API 中内嵌了相当多的机器学习能力。在识别名词短语时TextBlob 提供多种抽取器可选。来看ConllExtractorfrom textblob import TextBlob from textblob.np_extractors import ConllExtractor # 导入并创建一个 Conll 抽取器供稍后使用 extractor ConllExtractor() # 之后需要名词短语抽取器时 user_input input( ) user_input_blob TextBlob(user_input, np_extractorextractor) # 注意指定了非默认抽取器 np user_input_blob.noun_phrases这段代码做了什么ConllExtractor是一个使用 ConLL-2000 训练语料训练的组块解析chunk parsing名词短语抽取器。ConLL-2000 指 2000 年举办的计算自然语言学习会议Conference on Computational Natural Language Learning。该会议每年设一个工作坊解决一个棘手的 NLP 问题2000 年的题目正是名词组块noun chunking。当时的模型使用《华尔街日报》语料训练第 15–18 节作为训练数据211727 个 token第 20 节作为测试数据47377 个 token。提示TextBlob 官方提供了一份便于快速上手的 Quick Start 指南推荐给有经验的 Python 开发者阅读。挑战用 NLP 升级你的聊天机器人上一课6-NLP/1-Introduction-to-NLP/README.md你构建了一个只会随机应答的简单问答机器人参考实现见 1-Introduction-to-NLP 的 solution核心只是从random_responses列表中随机挑一句话。现在我们要让 Marvin 变得更共情打印说明指导用户如何与机器人交互启动循环接收用户输入如果用户要求退出则退出处理用户输入确定合适的情感回应如果在输入中检测到名词短语将其复数化pluralize并就这个话题追问更多信息打印回应回到第 2 步继续循环。以下是使用 TextBlob 判定情感的代码片段。注意这里只设了四档情感回应梯度如果你愿意完全可以更多if user_input_blob.polarity -0.5: response Oh dear, that sounds bad. elif user_input_blob.polarity 0: response Hmm, thats not great. elif user_input_blob.polarity 0.5: response Well, that sounds positive. elif user_input_blob.polarity 1: response Wow, that sounds great. 仓库参考实现完整的 Marvin 源码本仓库提供了该挑战的完整参考实现 6-NLP/2-Tasks/solution/bot.py其关键逻辑如下可直接对照学习import random from textblob import TextBlob from textblob.np_extractors import ConllExtractor extractor ConllExtractor() def main(): print(Hello, I am Marvin, the friendly robot.) print(You can end this conversation at any time by typing bye) print(After typing each answer, press enter) print(How are you today?) while True: # 等待用户输入文本 user_input input( ) if user_input.lower() bye: # 如果输入了 bye或 BYE、ByE、byE 等跳出循环 break else: # 基于用户输入创建 TextBlob然后抽取名词短语 user_input_blob TextBlob(user_input, np_extractorextractor) np user_input_blob.noun_phrases response if user_input_blob.polarity -0.5: response Oh dear, that sounds bad. elif user_input_blob.polarity 0: response Hmm, thats not great. elif user_input_blob.polarity 0.5: response Well, that sounds positive. elif user_input_blob.polarity 1: response Wow, that sounds great. if len(np) ! 0: # 至少检测到一个名词短语就复数化并追问 # 例如 cat - cats 或 mouse - mice response response Can you tell me more about np[0].pluralize() ? else: response response Can you tell me more? print(response) print(It was nice talking to you, goodbye!) # 启动程序 main()从源码结构可以看到几个值得注意的实现细节user_input.lower() bye对用户输入做了小写归一化因此无论用户输入bye、BYE还是ByE都能正确退出循环TextBlob(user_input, np_extractorextractor)显式传入非默认的ConllExtractor使noun_phrases使用 ConLL-2000 训练的组块解析器极性判断是级联的elif分支把polarity-1.0 ~ 1.0切成四档 -0.5、 0、 0.5、 1分别对应糟糕、不太好、积极、很棒四档回应名词短语处理使用了np[0].pluralize()只取第一个检测到的名词短语并调用 TextBlob 的屈折变化能力将其复数化如 cat → cats、mouse → mice再嵌入追问语句当len(np) 0没有检测到名词短语时回退为通用的 Can you tell me more?保证任何输入都有合理回应。示例输出下面是一段引导性的示例输出以开头的是用户输入Hello, I am Marvin, the friendly robot. You can end this conversation at any time by typing bye After typing each answer, press enter How are you today? I am ok Well, that sounds positive. Can you tell me more? I went for a walk and saw a lovely cat Well, that sounds positive. Can you tell me more about lovely cats? cats are the best. But I also have a cool dog Wow, that sounds great. Can you tell me more about cool dogs? I have an old hounddog but he is sick Hmm, thats not great. Can you tell me more about old hounddogs? bye It was nice talking to you, goodbye!注意对话流用户每次输入后Marvin 先按极性给出情感回应Well, that sounds positive.、Wow, that sounds great.、Hmm, thats not great.再把检测到的名词短语复数化后追问lovely cats → cool dogs → old hounddogs形成一个表面上看理解了话题的连贯对话。运行前提运行本课代码需要先安装 TextBlob 并下载其语料库上一课 1-Introduction-to-NLP/README.md 中有明确安装步骤pip install -U textblob python -m textblob.download_corpora课程环境要求具备 Python 3 基础input、循环、数组等并使用 Visual Studio Code 及 Python 扩展或你习惯的任何 Python IDE。注意ConllExtractor等组块解析功能依赖已下载的语料数据首次运行前务必执行download_corpora。知识检验你觉得这些共情式回应会让人误以为机器人真的理解了他们吗识别出名词短语会让机器人显得更可信吗从句子中抽取名词短语为什么是有用的操作把上面的机器人实现出来找朋友测试一下它能骗过他们吗你能让机器人更可信吗 挑战从上面的知识检验中任选一项尝试实现。用朋友来测试这个机器人它能骗到他们吗你能否让机器人更可信例如可以增加更多情感梯度档位、识别 why / how 等触发词给出特定回应或者让追问句式更多样。复习与延伸接下来的课程3-Translation-Sentiment/README.md 及后续 4-Hotel-Reviews-1、5-Hotel-Reviews-2将深入讲解情感分析——包括用机器学习做翻译与情感分析、数据准备、以及用 NLTK 做酒店评论情感分析。你可以进一步研究 KDNuggets 等社区上关于 NLP 的技术文章。课后作业完成 作业让机器人开口回应Make a bot talk back在之前的课程中你编写了一个可以聊天的基础机器人它会给出随机回答直到你说 bye。你能让回答不那么随机吗能否在你说了特定内容如 why 或 how时触发特定回答想一想在扩展机器人时机器学习如何让这类工作减少人工。你可以使用 NLTK 或 TextBlob 库来简化任务。评分标准如下标准优秀合格待改进提交了有说明文档的全新 bot.py 文件提交了新 bot 文件但存在 bug未提交文件本课在 ML-For-Beginners 课程体系中的位置它是 NLP 单元的第二课6-NLP/README.md 列出了全部五课承接第一课NLP 导论 随机应答机器人为第三课起的翻译与情感分析打下任务级基础——先掌握有哪些 NLP 任务再学会用现成库完成这些任务最终走向用机器学习自动完成这些任务。【免费下载链接】ML-For-Beginners12 weeks, 26 lessons, 52 quizzes, classic Machine Learning for all项目地址: https://gitcode.com/GitHub_Trending/ml/ML-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表