教程机器学习人工智能【免费下载链接】ML-For-Beginners12 weeks, 26 lessons, 52 quizzes, classic Machine Learning for all项目地址https://gitcode.com/GitHub_Trending/ml/ML-For-Beginners点击查看免费下载导读本文以 6-NLP/5-Hotel-Reviews-2 课程的课后作业为蓝本完整讲解如何用 Python 与 NLTK 的 VADER 情感分析器为评论文本赋予情感分数并指导你把这套流程迁移到任意全新数据集上独立完成分析与验证。读完本文你将掌握从数据清洗、Tag 列处理、停用词移除到情感分数计算与结果校验的完整 NLP 实战管线并具备按作业要求新建 notebook、记录思路、产出可交付成果的能力。一、作业任务定位把已学技能迁移到新数据集本课的课后作业assignment要求学习者完成一次迁移式实践既然你已经学会了使用 NLTK 为文本赋予情感sentiment请尝试另一个不同的数据集。你很可能需要围绕它做一些数据预处理因此请创建一个 notebook 并记录你的思考过程。你发现了什么这既不是简单的照抄代码练习也不是全新的算法题而是要求你把上一节课程中针对酒店评论Hotel Reviews建立的情感分析管线重新应用到一份陌生的数据上。完成它需要你具备四层能力理解课程中情感分析流程每一步为什么这样做面对新数据时能识别其结构差异并做相应的数据清洗用 notebook 的形式组织代码、图表与文字说明记录决策过程用课程中情感分数 vs 评论者打分的对照思路校验结果质量。评分标准Rubric作业附带的评分标准非常明确直接决定了交付物的验收要求标准优秀Exemplary合格Adequate需改进Needs Improvement提交一份完整的 notebook 与数据集单元格有良好文档说明解释情感是如何被赋予的notebook 缺少良好的解释说明notebook 不完整或有缺陷可以看出评分核心不是情感分数算得准不准而是 notebook 是否完整、每个单元格是否有清晰的文字说明。这是典型的技术写作类作业代码只是载体记录并解释你的思路才是交付物本体。因此写作本文时我们会把课程的每一步都讲透让你在新数据集上能写出每步都有据可查的文档化 notebook。二、背景课程原任务中的完整情感分析管线要完成迁移先要吃透原始管线。在 6-NLP/5-Hotel-Reviews-2/README.md 中情感分析建立在上一课 6-NLP/4-Hotel-Reviews-1/README.md 的探索性数据分析EDA基础之上。整个流程形成清晰的三段式流水线探索对原始Hotel_Reviews.csv约 515,000 行、17 列、欧洲 6 城市 1493 家酒店评论做 EDA判断各列可信度与可用性见 4-Hotel-Reviews-1 的探索 notebook清洗过滤无用列、重算自有指标、将 Tags 转化为可用的类别特征产出Hotel_Reviews_Filtered.csv见 1-notebook.ipynb情感分析加载过滤后数据移除停用词用 NLTK VADER 计算正负评论的情感分数产出Hotel_Reviews_NLP.csv见 3-notebook.ipynb。数据文件需要按 6-NLP/data/README.md 的说明下载到6-NLP/data/目录数据集为 Booking.com 公开数据遵循 CC0 公有领域许可。notebook 中统一通过../../data/Hotel_Reviews.csv这类相对路径读取。下面我们把这条管线拆解为可迁移的四个环节逐一给出原理与代码。三、环节一数据清洗与特征工程过滤notebook课程的过滤逻辑建立在数据集中有相当一部分列不可信、不可验证或无用这一前提上。EDA 阶段发现的问题包括Average_Score是数据集创建者按最近一年最新评论计算的口径与按本数据集评论自行计算的均值并不一致同一家酒店可能一个给 7.1、一个算出 6.8Total_Number_of_Reviews指向的数据超出本数据集范围lat/lng在推荐场景中暂时无用。解决方案是丢弃存疑列用本数据集内的数据重算可信指标。3.1 地址归一化Hotel_Address是完整长地址但数据集中实际只覆盖 6 个城市。用字符串匹配把地址压缩成城市, 国家的规整形式以下代码可直接运行def replace_address(row): if Netherlands in row[Hotel_Address]: return Amsterdam, Netherlands elif Barcelona in row[Hotel_Address]: return Barcelona, Spain elif United Kingdom in row[Hotel_Address]: return London, United Kingdom elif Milan in row[Hotel_Address]: return Milan, Italy elif France in row[Hotel_Address]: return Paris, France elif Vienna in row[Hotel_Address]: return Vienna, Austria # Replace all the addresses with a shortened, more useful form df[Hotel_Address] df.apply(replace_address, axis 1) # The sum of the value_counts() should add up to the total number of reviews print(df[Hotel_Address].value_counts())归一化后即可按国家/城市粒度查询酒店分布display(df.groupby(Hotel_Address).agg({Hotel_Name: nunique}))Hotel_AddressHotel_NameAmsterdam, Netherlands105Barcelona, Spain211London, United Kingdom400Milan, Italy162Paris, France458Vienna, Austria158注意replace_address中有一个不变量可作自检value_counts()之和应等于评论总数。若迁移到新数据集务必找到类似的可验证不变量如分组计数之和等于行数这是文档化 notebook 中极具说服力的校验点。3.2 重算酒店元指标Additional_Number_of_Scoring、Total_Number_of_Reviews、Average_Score均基于外部口径全部替换为基于本数据集的计算值# Drop Additional_Number_of_Scoring df.drop([Additional_Number_of_Scoring], axis 1, inplaceTrue) # Replace Total_Number_of_Reviews and Average_Score with our own calculated values df.Total_Number_of_Reviews df.groupby(Hotel_Name).transform(count) df.Average_Score round(df.groupby(Hotel_Name).Reviewer_Score.transform(mean), 1)groupby(Hotel_Name).transform(count)得到每家酒店在本数据集内的实际评论条数Reviewer_Score.transform(mean)保留一位小数得到可独立验证的酒店平均分。3.3 列取舍清单课程按列语义分组给出了明确的保留/删除清单迁移到新数据集时这套按列语义分组评估的思路同样适用分组保留删除酒店列Hotel_Name、Hotel_Address已归一化lat、lng酒店元评论列—Additional_Number_of_Scoring评论列Reviewer_Score、Negative_Review、Positive_Review、Tags暂留Review_Total_Negative_Word_Counts、Review_Total_Positive_Word_Counts、Review_Date、days_since_review评论者列Reviewer_NationalityTotal_Number_of_Reviews_Reviewer_Has_Given其中Reviewer_Nationality保留但不建议作为强特征——上一课明确警告把国籍与评论倾向挂钩容易滑向刻板印象每位评论者都是基于亲身经历独立写作的个体。这一判断在迁移到新数据集时同样值得写进 notebook 的说明文字。四、环节二把Tags列变成可用的类别特征这是课程中最能体现 NLP 思维的一个环节也是新数据集上最值得复用的方法论。4.1 问题本质Tags列存的是以文本列表形式出现的多词短语例如[ Business trip , Solo traveler , Single Room , Stayed 5 nights , Submitted from a mobile device ]。问题有三每个标签是多词短语如Business trip而非单词直接做词频统计会把短语拆散各行标签的顺序和数量不固定有的 3 个、有的 5 个、有的 6 个数据规模大约 51.5 万行、1427 家酒店、全文 6762646 个词对全部短语做频率分布耗时惊人。课程给出的解法体现了先用 EDA 缩小问题空间再让 NLP 处理的工程智慧先利用每个标签本身就是以逗号分隔的短语这一事实用 pandas 的字符串与melt操作快速把标签打平统计而不是一上来就跑 n-gram 频率算法。4.2 清洗与打平# Remove opening and closing brackets df.Tags df.Tags.str.strip([]) # remove all quotes too df.Tags df.Tags.str.replace( , , ,, regex False)清洗后每个标签形如Business trip, Solo traveler, Single Room, Stayed 5 nights, Submitted from a mobile device。由于各行标签数量不等用str.split(,, expandTrue)拆成最多 6 列临时列再melt合并成一列后做value_counts()完整实现见 2-notebook.ipynb# Now split the strings into a list tag_list_df df.Tags.str.split(,, expand True) # Remove leading and trailing spaces df[Tag_1] tag_list_df[0].str.strip() df[Tag_2] tag_list_df[1].str.strip() df[Tag_3] tag_list_df[2].str.strip() df[Tag_4] tag_list_df[3].str.strip() df[Tag_5] tag_list_df[4].str.strip() df[Tag_6] tag_list_df[5].str.strip() # Merge the 6 columns into one with melt df_tags df.melt(value_vars[Tag_1, Tag_2, Tag_3, Tag_4, Tag_5, Tag_6])打平后共识别出2428 个唯一标签其中高频项一目了然TagCountLeisure trip417778Submitted from a mobile device307640Couple252294Stayed 1 night193645Stayed 2 nights133937Solo traveler108545Stayed 3 nights95821Business trip82939Group65392Family with young children61015Stayed 4 nights47817Double Room35207Standard Double Room32248Superior Double Room31393Family with older children26349Deluxe Double Room24823Double or Twin Room22393Stayed 5 nights20845Standard Double or Twin Room17483Classic Double Room16989Superior Double or Twin Room135702 rooms12393Submitted from a mobile device这类高频标签对推荐任务毫无价值但因为打平统计很快先保留再忽略是更省事的策略。4.3 按语义筛选有用的标签回到任务目标——为酒店推荐机器人补充情感与画像特征。课程给出的取舍原则是旅行类型Leisure / Business相关 → 保留客群类型情侣、独行、家庭等相关 → 保留房型/套房/单间→ 无关所有酒店的房间本质相似提交设备→ 无关入住晚数→ 与好感度的关联牵强无关。据此先剔除入住晚数类与房型类标签入住晚数CountStayed 1 night193645Stayed 2 nights133937Stayed 3 nights95821Stayed 4 nights47817Stayed 5 nights20845Stayed 6 nights9776Stayed 7 nights7399Stayed 8 nights2502Stayed 9 nights1293......房型CountDouble Room35207Standard Double Room32248Superior Double Room31393Deluxe Double Room24823Double or Twin Room22393Standard Double or Twin Room17483Classic Double Room16989Superior Double or Twin Room13570最终保留的有用标签共 8 类为TagCountLeisure trip417778Couple252294Solo traveler108545Business trip82939Group与 Travellers with friends 合并67535Family with young children61015Family with older children26349With a pet1405Travellers with friends与Group语义基本等同合并是合理的工程决策。在 2-notebook.ipynb 中对应的过滤实现为先按房间/晚数/设备等关键词做str.contains剔除再对剩余标签用value_counts统计并过滤低频项。4.4 生成独热特征列最后为每个保留标签新建 0/1 列逐行判断该评论是否命中df[Leisure_trip] df.Tags.apply(lambda tag: 1 if Leisure trip in tag else 0) df[Couple] df.Tags.apply(lambda tag: 1 if Couple in tag else 0) df[Solo_traveler] df.Tags.apply(lambda tag: 1 if Solo traveler in tag else 0) df[Business_trip] df.Tags.apply(lambda tag: 1 if Business trip in tag else 0) df[Group] df.Tags.apply(lambda tag: 1 if Group in tag or Travelers with friends in tag else 0) df[Family_with_young_children] df.Tags.apply(lambda tag: 1 if Family with young children in tag else 0) df[Family_with_older_children] df.Tags.apply(lambda tag: 1 if Family with older children in tag else 0) df[With_a_pet] df.Tags.apply(lambda tag: 1 if With a pet in tag else 0)得到的聚合信息即为有多少评论者按酒店聚合是商务出行还是休闲出行、是否带宠物——这正是推荐酒店时极有价值的画像特征。在 1-notebook.ipynb 中这一步骤与其余清洗操作在同一 notebook 内完成清洗全程约 23.7 秒。五、环节三移除停用词加速情感分析情感分析是整条管线中最耗时的部分。课程在参考设备上实测直接对正负评论两列跑情感分析约需1214 分钟取决于所用情感库而移除停用词不改变句子情感的常见英文单词如冠词、介词、代词后情感分析可显著提速且准确率不降——因为停用词对情感判定没有贡献只会拖慢计算。课程实测数据很有参考价值最长的负面评论原本 395 词移除停用词后仅 195 词对 515,000 行、两列评论移除停用词仅耗时3.3 秒参考设备实际耗时因 CPU 速度、内存、是否 SSD 而异。移除停用词的实现要点是先用set建立缓存避免每行重复查 NLTK 词表源自 Kaggle 上 Ryan Han 对停用词移除性能的对比结论import time import pandas as pd import nltk as nltk from nltk.corpus import stopwords from nltk.sentiment.vader import SentimentIntensityAnalyzer nltk.download(vader_lexicon) # Load the hotel reviews from CSV df pd.read_csv(../../data/Hotel_Reviews_Filtered.csv) # Remove stop words - can be slow for a lot of text! start time.time() cache set(stopwords.words(english)) def remove_stopwords(review): text .join([word for word in review.split() if word not in cache]) return text # Remove the stop words from both columns df.Negative_Review df.Negative_Review.apply(remove_stopwords) df.Positive_Review df.Positive_Review.apply(remove_stopwords)在 3-notebook.ipynb 的实测中这一步骤耗时约 5.8 秒。迁移到新数据集时记得先确认新文本的语言VADER 与英语停用词表均面向英语并保留停用词移除前后行数不变、仅文本缩短的校验记录。六、环节四用 NLTK VADER 计算情感分数课程选用的情感分析器是 NLTK 自带的VADERValence Aware Dictionary and sEntiment Reasoner出自 Hutto Gilbert 2014 年论文《VADER: A Parsimonious Rule-based Model for Sentiment Analysis of Social Media Text》ICWSM-14。它是一种基于规则与情感词典的模型专门为社交媒体文本设计无需训练即可使用适合课程与入门实战。6.1 处理三种输入情形评论列存在哨兵值未填写时为No Negative或No Positive需要单独处理为情感分数 0from nltk.sentiment.vader import SentimentIntensityAnalyzer # Create the vader sentiment analyser (there are others in NLTK you can try too) vader_sentiment SentimentIntensityAnalyzer() # There are 3 possibilities of input for a review: # It could be No Negative, in which case, return 0 # It could be No Positive, in which case, return 0 # It could be a review, in which case calculate the sentiment def calc_sentiment(review): if review No Negative or review No Positive: return 0 return vader_sentiment.polarity_scores(review)[compound]polarity_scores()返回包含neg、neu、pos、compound的字典课程取compound归一化到 [-1, 1] 的综合情感分数负值越接近 -1 越负面正值越接近 1 越正面作为最终特征。6.2 批量计算并保存# Add a negative sentiment and positive sentiment column print(Calculating sentiment columns for both positive and negative reviews) start time.time() df[Negative_Sentiment] df.Negative_Review.apply(calc_sentiment) df[Positive_Sentiment] df.Positive_Review.apply(calc_sentiment) end time.time() print(Calculating sentiment took str(round(end - start, 2)) seconds)在 3-notebook.ipynb 实测中两列 51.5 万行的情感计算约耗时201 秒约 3.4 分钟远低于 1214 分钟印证了移除停用词的加速价值。6.3 结果校验情感分数 vs 评论者打分作业与课程的灵魂在于验证把情感分数与同一评论的Reviewer_Score1~10 的数值打分对照看两者是否一致。不一致可能有两种解释评论文本与打分不匹配情感分析器未能正确识别情感。一个经典案例是反讽sarcasmOf course I LOVED sleeping in a room with no heating我当然爱死了在没有暖气的房间睡觉——VADER 会判定为正面情感而人类一眼就知道是讽刺。这类可解释的错误是 notebook 中极有价值的讨论素材建议如实记录而不是试图掩盖。对照输出的方法df df.sort_values(by[Negative_Sentiment], ascendingTrue) print(df[[Negative_Review, Negative_Sentiment]]) df df.sort_values(by[Positive_Sentiment], ascendingTrue) print(df[[Positive_Review, Positive_Sentiment]])在 3-notebook.ipynb 的实测输出中可以看到Negative_Review列情感分数可从 -0.9920极端负面一直分布到 0.9948文本其实在夸酒店却写在了负面栏Positive_Review列同理存在大量文本与列名语义相反的样本。这正是上一课提醒过的现象——评论者可能把负面内容写进 Positive 栏反之亦然只数词数而不看情感会得出扭曲的结论。6.4 列重排与最终保存情感列追加完毕后把列重排成对人类友好的顺序纯展示性调整再写入新文件# Reorder the columns (This is cosmetic, but to make it easier to explore the data later) df df.reindex([Hotel_Name, Hotel_Address, Total_Number_of_Reviews, Average_Score, Reviewer_Score, Negative_Sentiment, Positive_Sentiment, Reviewer_Nationality, Leisure_trip, Couple, Solo_traveler, Business_trip, Group, Family_with_young_children, Family_with_older_children, With_a_pet, Negative_Review, Positive_Review], axis1) print(Saving results to Hotel_Reviews_NLP.csv) df.to_csv(r../data/Hotel_Reviews_NLP.csv, index False)至此完整流水线闭环Hotel_Reviews.csv→探索→Hotel_Reviews_Filtered.csv→情感分析→Hotel_Reviews_NLP.csv后者即可用于课程最后的聚类挑战——用学过的聚类策略见 5-Clustering 章节围绕情感分数寻找模式。七、把管线迁移到新数据集完成任务的操作路线回到作业本身。要在另一个数据集上复刻以上能力并拿到优秀档建议按如下顺序组织你的 notebook步骤 1先做 EDA再写代码参照 4-Hotel-Reviews-1 探索 notebook 的做法先逐列回答这列是什么、可信吗、怎么算出来的、能否独立验证把结论写入 Markdown 单元格。新数据集的坑往往和酒店数据不同缺失值、编码问题、重复行、文本列含哨兵值等EDA 阶段发现的每个问题都应在后续清洗代码中有对应处理。步骤 2逐环节迁移四步管线环节原任务做法迁移要点数据清洗丢lat/lng、归一化地址、重算均值识别并丢弃不可验证列用本数据集重算可信指标保留可验证不变量类别特征Tags 打平统计、独热编码若新数据也有列表型文本列先清洗括号引号 → 拆分 → 打平 → 频率统计 → 按业务语义筛选 → 独热停用词set缓存 apply移除确认新文本语言匹配英语停用词表记录耗时对比情感分析VADERcompound哨兵值置 0处理新数据的无文本哨兵值必要时对比 NLTK 其他分析器步骤 3贯穿全程的思考过程记录评分标准最看重的是解释。每个单元格至少回答三个问题为什么做这一步、这一步的输入输出是什么、结果说明了什么。以下思考角度能显著提升 notebook 质量描述你观察到的数据结构特征行数、列数、文本长度分布、缺失哨兵值记录为加速计算做的每个决策及其耗时实测如停用词移除前后对比用情感分数 vs 数值打分的对照找出不一致样本并解释原因反讽、列名与内容语义颠倒、语言非英语等总结新数据集上你发现了什么——哪些特征是有效信号、哪些是噪声正是作业最后一个问题的落点。步骤 4交付物自检对照评分标准做最终检查notebook 从加载数据到保存结果完整可运行每个代码单元格上方/下方有 Markdown 说明数据集或生成的数据文件随 notebook 一并呈现明确写出情感是如何被赋予的分析器、打分函数、哨兵值处理有对照/校验环节证明结果的合理性。八、可继续深入本仓库的参考路径作业原文6-NLP/5-Hotel-Reviews-2/assignment.md课程正文数据清洗、Tag 处理、情感分析的完整讲解6-NLP/5-Hotel-Reviews-2/README.md清洗与标签独热化参考实现1-notebook.ipynb标签打平与频率统计参考实现2-notebook.ipynb情感分析完整参考实现3-notebook.ipynb上一课的数据探索列语义解读与 EDA6-NLP/4-Hotel-Reviews-1/README.md 与其 探索 notebook数据文件放置说明6-NLP/data/README.md结语从一份 51.5 万行的酒店评论数据出发课程演示了如何用EDA 缩小问题空间 pandas 高效处理 NLTK VADER 情感分析 结果对照校验的完整思路把不可信、不可用的原始列逐步转化为可信、可解释、可用于推荐的特征。作业要求你把这套方法论迁移到新数据集本质上考察的正是理解原理而非背诵代码的能力。带着每一步都要能写出为什么的标准去新建 notebook你产出的将不仅是一份作业更是一份可复用的 NLP 数据管线范本。赞分享教程机器学习人工智能【免费下载链接】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 实战使用 NLTK 与 VADER 对欧洲酒店评论进行过滤与情感分析ML For Beginners 实战使用 NLTK 与 VADER 对欧洲酒店评论进行过滤与情感分析 导读 本文对应 ML For Beginners 课程教程机器学习人工智能ML-For-Beginners 实战课基于酒店评论数据的 NLTK 情感分析全流程数据过滤与 VADER 实现ML For Beginners 实战课基于酒店评论数据的 NLTK 情感分析全流程数据过滤与 VADER 实现 导读 本篇文章是开源课程 ML For教程机器学习人工智能Email Verification API 核心组件深潜一Login Status API 如何建立登录态Email Verification API 核心组件深潜一Login Status API 如何建立登录态 Email Verification API创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考