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本篇技术指南对应 ML-For-Beginners 课程第 6 章自然语言处理第 2 课Common natural language processing tasks and techniques丹麦语译本见 translations/da/6-NLP/2-Tasks/README.md英文原版见 6-NLP/2-Tasks/README.md。课程围绕 NLP 的基础任务分词、词嵌入、句法解析、词频统计、N-gram、名词短语提取、情感分析等展开并以 Python 的 TextBlob 库为载体手把手指导你把这些技术集成进一个能感知情绪、会追问名词短语的对话机器人。读完本文你将理解 NLP 流水线中每个环节的作用掌握 TextBlob 的典型 API并能独立复现与扩展课程附带的机器人实现。NLP 任务流水线先理解任务再谈机器学习对于绝大多数自然语言处理NLP任务待处理的文本都必须先被拆解broken down、被检视examined其结果再与规则、数据集进行交叉引用或存储。这一系列任务让程序员得以从文本中提炼出含义meaning、意图intent或者仅仅是词项与词语的频率frequency。课程强调一个关键观点在把机器学习应用于这些任务之前先要理解 NLP 专家会遇到的经典问题。这些任务通常不是孤立执行的而是按照一定**顺序sequence**组成一条处理流水线——先分词、再标注、再解析、再统计或建模。接下来的小节逐一剖析这些任务每个小节都配有原文的图解与可验证的示例。分词Tokenization大多数 NLP 算法要做的第一件事几乎都是把文本切分成 token令牌或单词。听起来简单但难点在于必须处理标点符号以及不同语言各自独特的词边界与句子边界word and sentence delimiters。因此你可能需要使用多种方法来确定切分界限。上图是对《傲慢与偏见》Pride and Prejudice中一句话的分词示意Infographic by Jen Looper图中每个单词被独立标出直观展示了把连续文本切成离散词元的过程。分词是后续所有任务的地基词性标注、N-gram、词频统计都建立在 token 集合之上。从实现层面看不同语言的分词策略差异很大如中文没有天然空格边界需要额外算法这也是课程提醒可能要使用各种方法来判定边界的原因。词嵌入EmbeddingsWord embeddings词嵌入是一种将文本数据数值化的方法。嵌入的关键特性是语义相近的词、或经常一起出现的词会在向量空间中彼此聚拢cluster together从而把离散的符号转化为机器可计算的连续向量。上图展示了 I have the highest respect for your nerves, they are my old friends. 中单词的嵌入关系语义相关的词被圆圈分组并连线Infographic by Jen Looper。你可以借助 TensorFlow 官方的 Embedding Projector 在线工具动手体验点击一个词会显示出与之聚类的相似词例如 toy 会与 disney、lego、playstation、console 聚类在一起。这类可视化能帮助初学者直观建立词向量空间中相似词邻近的直觉。句法解析与词性标注Parsing Part-of-speech Tagging每个被分词的单词都可以被打上词性part of speech标签——名词noun、动词verb或形容词adjective。例如句子the quick red fox jumped over the lazy brown dog可以被标注为fox 名词jumped 动词。解析Parsing关注的是句子中哪些词彼此相关。例如the quick red fox jumped是一个形容词-名词-动词序列它与后面的lazy brown dog序列是分离的。通过解析程序可以还原句子的语法结构这是理解谁对谁做了什么的基础。词与短语频率统计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.由于短语频率可以按需选择大小写不敏感case-insensitive或大小写敏感case-sensitive课程给出的统计结果是短语a friend频率为 2the频率为 6travels为 2。这个环节的意义在于词频分布是很多统计型 NLP 方法如 TF-IDF、关键词提取的输入基础。N-gram定长滑动窗口文本可以按固定长度切分成词序列单个词叫unigram一元组两个词叫bigram二元组三个词叫trigram三元组任意数量则统称n-grams。以the quick red fox jumped over the lazy brown dog为例当 n-gram 取值为 2 时会生成以下 9 个 bigramthe quickquick redred foxfox jumpedjumped overover thethe lazylazy brownbrown dog把它想象成一个在句子上**滑动的盒子sliding box**会更直观。下面是 n3trigram时每个 n-gram 在句中高亮的位置the quick redfox jumped over the lazy brown dogthequick red foxjumped over the lazy brown dogthe quickred fox jumpedover the lazy brown dogthe quick redfox jumped overthe lazy brown dogthe quick red foxjumped over thelazy brown dogthe quick red fox jumpedover the lazybrown dogthe quick red fox jumped overthe lazy browndogthe quick red fox jumped over thelazy brown dogN-gram 的价值在于捕捉局部词序信息它让模型能够感知哪些词习惯性相邻出现是语言建模、拼写纠错、文本生成等任务的重要特征来源。名词短语提取Noun Phrase Extraction大多数句子中都存在一个充当**主语subject或宾语object**的名词。在英语中它常常可以通过前置的 a、an 或 the 来识别。通过提取名词短语来识别句子的主语或宾语是 NLP 中理解句子含义时的常见任务。在the quick red fox jumped over the lazy brown dog中可以提取出 2 个名词短语quick red fox和lazy brown dog。思考练习在下面这句话中你能识别出其中的名词短语吗 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.情感分析Sentiment Analysis句子或文本可以被分析出情感倾向——即它有多正面positive或多负面negative。情感通常用两个维度度量极性Polarity取值从-1.0 到 1.0从负面到正面客观性/主观性Objectivity/Subjectivity取值从0.0 到 1.0从最客观到最主观。课程提示用机器学习判定情感有多种途径其中一种朴素思路是由人类专家预先维护一份正面/负面词与短语清单再将该模型应用到文本上计算极性得分。你可以想一想这种方式在哪些场景下有效在哪些场景下例如讽刺、反语效果欠佳这正是后续课程会深入探讨的话题。词形变化与词形还原Inflection Lemmatization词形变化Inflection允许你取一个词并得到它的单数或复数形式singular or plural例如 cat → cats、mouse → mice。词形还原Lemmatizationlemma词元是一组词的根形式或主词条root or headword。例如flew、flies、flying这组词的 lemma 都是动词fly。两者的区别在于词形变化处理的是形态上的单复数变换词形还原则是把各种屈折形式归一到词典主词条是文本归一化的常用手段。词网 WordNetNLP 研究者的词汇数据库对于 NLP 研究者而言还有一些非常有用的数据库其中最著名的是WordNetWordNet 是一个覆盖多种语言的词汇数据库记录了每个词的同义词、反义词以及大量其他细节。在构建翻译系统、拼写检查器或任何类型的语言工具时它都极其有用。实战用 TextBlob 库快速落地这些任务幸运的是你不必从零实现以上所有技术——Python 生态中有大量优秀的库让非 NLP/ML 专业的开发者也能轻松上手。课程选用的TextBlob就站在 NLTK 和 pattern 这两个巨人的肩膀上并且与二者配合良好其 API 中内置了相当可观的机器学习能力。安装 TextBlob在动手前请先安装 TextBlob 并下载其语料库corpora。安装命令来自本课程前一课 6-NLP/1-Introduction-to-NLP/README.md 的前置环境说明pip install -U textblob python -m textblob.download_corpora提示直接在 Visual Studio Code 的 Python 环境中运行即可课程代码示例基于 Python 3.8。使用 ConllExtractor 提取名词短语当需要识别名词短语时TextBlob 提供多种提取器extractor课程重点介绍ConllExtractorfrom textblob import TextBlob from textblob.np_extractors import ConllExtractor # import and create a Conll extractor to use later extractor ConllExtractor() # later when you need a noun phrase extractor: user_input input( ) user_input_blob TextBlob(user_input, np_extractorextractor) # note non-default extractor specified np user_input_blob.noun_phrases这里发生了什么ConllExtractor官方描述是A noun phrase extractor that uses chunk parsing trained with the ConLL-2000 training corpus一种使用基于 ConLL-2000 训练语料的 chunk parsing 的名词短语提取器。ConLL-2000指的是 2000 年举办的Conference on Computational Natural Language Learning计算自然语言学习会议该会议每年举办一场研讨会来解决一个棘手的 NLP 问题2000 年的主题正是名词组块noun chunking。当年使用《华尔街日报》Wall Street Journal语料训练模型其中第 15-18 节作为训练数据211727 个 token第 20 节作为测试数据47377 个 token。注意代码中的注释这里显式传入了非默认的提取器np_extractorextractor说明 TextBlob 允许按需替换名词短语提取策略。实战挑战用 NLP 升级你的对话机器人上一课 6-NLP/1-Introduction-to-NLP/README.md 中你构建了一个只会从随机回复列表中选话的简单 QA 机器人Marvin, the simple robot参考实现见 6-NLP/1-Introduction-to-NLP/solution/bot.pyrandom_responses [That is quite interesting, please tell me more., I see. Do go on., Why do you say that?, Funny weather weve been having, isnt it?, Lets change the subject., Did you catch the game last night?]本课的任务是让 Marvin变得更有同理心——通过分析用户输入的情感输出匹配的回应同时识别输入中的名词短语并围绕它追问。构建更好对话机器人的步骤打印指引告诉用户如何与机器人交互开始主循环接收用户输入如果用户请求退出则退出循环处理用户输入并确定合适的情感回应如果在输入中检测到名词短语将其复数化并就该话题请求更多信息打印回应回到第 2 步继续循环。四档情感回应代码使用 TextBlob 判定情感的代码片段如下。注意这里只定义了四档gradients情感回应你完全可以自行增加更多档位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. 档位划分完全对应前文介绍的polarity 取值区间 [-1.0, 1.0]≤ -0.5 为听起来很糟≤ 0 为不太妙≤ 0.5 为听起来积极≤ 1 为太棒了。完整参考实现课程在 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: # wait for the user to enter some text user_input input( ) if user_input.lower() bye: # if they typed in bye (or even BYE, ByE, byE etc.), break out of the loop break else: # Create a TextBlob based on the user input. Then extract the noun phrases 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: # There was at least one noun phrase detected, so ask about that and pluralise it # e.g. cat - cats or 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!) # Start the program main()值得注意的实现细节退出判断user_input.lower() bye对大小写不敏感用户输入 BYE、ByE 等都能退出情感分级四档if/elif按 polarity 区间匹配回应名词短语追问若len(np) ! 0至少检测到一个名词短语取第一个np[0]并调用.pluralize()复数化后追问例如cat→cats、mouse→mice否则只做泛化追问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!注意观察机器人不仅根据 polarity 切换了情感档位还把lovely cat复数化为lovely cats、cool dog复数化为cool dogs进行追问——这正是前面学过的**名词短语提取 词形变化复数化**两个技术在同一个应用中的落地。知识点自检你认为这些有同理心的回应会让人误以为机器人真的理解了他们吗识别名词短语是否让机器人显得更可信从句子中提取名词短语为什么是有用的课后作业让机器人学会接话课程配套作业见 6-NLP/2-Tasks/assignment.md要求是让机器人真正接话在之前的课程中你编写了一个只会随机回答、直到你说 bye 的基本聊天机器人。现在请让它少一点随机、多一些针对性的回答——例如当用户说出 why 或 how 等特定词时触发相应回复思考在你扩展机器人的过程中机器学习如何让这类工作减少手工规则可以借助 NLTK 或 TextBlob 库来简化任务。作业的评分标准Rubric如下标准优秀Exemplary合格Adequate待改进Needs Improvement综合表现提交了一个带完整文档说明的新 bot.py 文件提交了新 bot 文件但存在 bug未提交文件总结本课建立了一条完整的 NLP 认知链路分词 → 词性标注与解析 → 词/短语频率 → N-gram → 名词短语提取 → 情感分析 → 词形变化/词形还原并以 WordNet 作为词汇知识底座随后用 TextBlob 将理论落到代码——从ConllExtractor的名词短语提取到基于 polarity 的情感分级回应最终把上一课的随机机器人升级为具备情感感知 名词短语追问能力的对话机器人。下一步课程将继续深入情感分析的更多技术细节你可以先在本地运行 6-NLP/2-Tasks/solution/bot.py 感受效果再尝试按作业要求扩展自己的版本。【免费下载链接】ML-For-Beginners12 weeks, 26 lessons, 52 quizzes, classic Machine Learning for all项目地址: https://gitcode.com/GitHub_Trending/ml/ML-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表