【Kaggle微课程】Natural Language Processing - 1. Intro to NLP

文章目录

    • 1. 使用 spacy 库进行 NLP
    • 2. Tokenizing
    • 3. 文本处理
    • 4. 模式匹配
    • 练习:食谱满意度调查
      • 1 在评论中找到菜单项
      • 2 对所有的评论匹配
      • 3 最不受欢迎的菜
      • 4 菜谱出现的次数

learn from https://www.kaggle.com/learn/natural-language-processing

1. 使用 spacy 库进行 NLP

spacy:https://spacy.io/usage

  • spacy 需要指定语言种类,使用spacy.load()加载语言

管理员身份打开 cmd 输入python -m spacy download en 下载英语语言en模型

import spacy
nlp = spacy.load('en')
  • 你可以处理文本
doc = nlp("Tea is healthy and calming, don't you think?")

2. Tokenizing

Tokenizing 将返回一个包含 tokens 的 document 对象。 token 是文档中的文本单位,例如单个单词和标点符号。

SpaCy 将像 "don't"这样的缩略语分成两个标记:“do”“n’t”。可以通过遍历文档来查看 token。

for token in doc:print(token)

输出:

Tea
is
healthy
and
calming
,
do
n't
you
think
?

3. 文本处理

有几种类型的预处理可以改进我们如何用单词建模。

  • 第一种是 "lemmatizing",一个词的 "lemma"是它的基本形式。
    例如,“walk”是单词“walking”"lemma"。所以,当你把walking这个词"lemmatizing"时,你会把它转换成walk

  • 删除stopwords也是很常见的。stopwords是指在语言中经常出现的不包含太多信息的单词。英语的stopwords包括“the”,“is”,“and”,“but”,“not”

token.lemma_返回单词的lemma
token.is_stop,如果是停用词,返回布尔值True(否则返回False)

print(f"Token \t\tLemma \t\tStopword".format('Token', 'Lemma', 'Stopword'))
print("-"*40)
for token in doc:print(f"{str(token)}\t\t{token.lemma_}\t\t{token.is_stop}")


在上面的句子中,重要的词是tea, healthy, calming。删除 停用词 可能有助于预测模型关注相关词

Lemmatizing 同样有助于将同一单词的多种形式组合成一个基本形式("calming", "calms", "calmed" 都会转成 "calm")。

然而,Lemmatizing 和 删除停用词 可能会导致模型性能更差。因此,您应该将此预处理视为超参数优化过程的一部分。

4. 模式匹配

另一个常见的NLP任务:在文本块或整个文档中匹配单词或短语。
可以使用正则表达式进行模式匹配,但spaCy的匹配功能往往更易于使用。

要匹配单个tokens令牌,需要创建Matcher匹配器。当你想匹配一个词语列表时,使用PhraseMatcher会更容易、更有效。

例如,如果要查找不同智能手机型号在某些文本中的显示位置,可以为感兴趣的型号名称创建 patterns

  • 首先创建PhraseMatcher
from spacy.matcher import PhraseMatcher
matcher = PhraseMatcher(nlp.vocab, attr='lower')

以上,我们使用已经加载过的英语模型的单词进行匹配,并转换为小写后进行匹配

  • 创建要匹配的词语列表
terms = ['Galaxy Note', 'iPhone 11', 'iPhone XS', 'Google Pixel']
patterns = [nlp(text) for text in terms]
print(patterns)
# 输出 [Galaxy Note, iPhone 11, iPhone XS, Google Pixel]
matcher.add("match1", patterns)
# help(matcher.add)
text_doc = nlp("Glowing review overall, and some really interesting side-by-side ""photography tests pitting the iPhone 11 Pro against the ""Galaxy Note 10 Plus and last year’s iPhone XS and Google Pixel 3.") 
for i, text in enumerate(text_doc):print(i, text)
matches = matcher(text_doc)
print(matches)

输出:

0 Glowing
1 review
2 overall
3 ,
4 and
5 some
6 really
7 interesting
8 side
9 -
10 by
11 -
12 side
13 photography
14 tests
15 pitting
16 the
17 iPhone
18 11
19 Pro
20 against
21 the
22 Galaxy
23 Note
24 10
25 Plus
26 and
27 last
28 year
29 ’s
30 iPhone
31 XS
32 and
33 Google
34 Pixel
35 3
36 .
[(12981744483764759145, 17, 19), # iPhone 11
(12981744483764759145, 22, 24),  # Galaxy Note
(12981744483764759145, 30, 32),  # iPhone XS
(12981744483764759145, 33, 35)]  # Google Pixel
返回元组(匹配id, 匹配开始位置,匹配结束位置)
match_id, start, end = matches[3]
print(nlp.vocab.strings[match_id], text_doc[start:end])

输出:

match1 Google Pixel

练习:食谱满意度调查

你是DelFalco意大利餐厅的顾问。店主让你确认他们的菜单上是否有令食客失望的食物。

店主建议你使用Yelp网站上的评论来判断人们喜欢和不喜欢哪些菜。你从Yelp那里提取了数据。在开始分析之前,请运行下面的代码单元,快速查看必须使用的数据。

import pandas as pd
data = pd.read_json('../input/nlp-course/restaurant.json')
data.head()


店主还给了你这个菜单项和常见的替代拼写列表

menu = ["Cheese Steak", "Cheesesteak", "Steak and Cheese", "Italian Combo", "Tiramisu", "Cannoli","Chicken Salad", "Chicken Spinach Salad", "Meatball", "Pizza", "Pizzas", "Spaghetti","Bruchetta", "Eggplant", "Italian Beef", "Purista", "Pasta", "Calzones",  "Calzone","Italian Sausage", "Chicken Cutlet", "Chicken Parm", "Chicken Parmesan", "Gnocchi","Chicken Pesto", "Turkey Sandwich", "Turkey Breast", "Ziti", "Portobello", "Reuben","Mozzarella Caprese",  "Corned Beef", "Garlic Bread", "Pastrami", "Roast Beef","Tuna Salad", "Lasagna", "Artichoke Salad", "Fettuccini Alfredo", "Chicken Parmigiana","Grilled Veggie", "Grilled Veggies", "Grilled Vegetable", "Mac and Cheese", "Macaroni",  "Prosciutto", "Salami"]

根据Yelp提供的数据和菜单项列表,您有什么想法可以找到哪些菜单项让食客失望?

  • 你可以根据评论中提到的菜单项对其进行分组,然后计算每个项目的平均评分。你可以分辨出哪些食物在评价中被提及得分较低,这样餐馆就可以修改食谱或从菜单中删除这些食物。

1 在评论中找到菜单项

import spacy
from spacy.matcher import PhraseMatcherindex_of_review_to_test_on = 14
text_to_test_on = data.text.iloc[index_of_review_to_test_on]# Load the SpaCy model
nlp = spacy.blank('en')# Create the tokenized version of text_to_test_on
review_doc = nlp(text_to_test_on)# Create the PhraseMatcher object. The tokenizer is the first argument. Use attr = 'LOWER' to make consistent capitalization
matcher = PhraseMatcher(nlp.vocab, attr='LOWER')# Create a list of tokens for each item in the menu
menu_tokens_list = [nlp(item) for item in menu]# Add the item patterns to the matcher. 
# Look at https://spacy.io/api/phrasematcher#add in the docs for help with this step
# Then uncomment the lines below matcher.add("MENU",            # Just a name for the set of rules we're matching tomenu_tokens_list  )# Find matches in the review_doc
matches = matcher(review_doc)
for i, text in enumerate(review_doc):print(i, text)
for match in matches:print(f"Token number {match[1]}: {review_doc[match[1]:match[2]]}")
  • 找到了评论中包含食谱中的单词的位置
0 The
1 Il
2 Purista
3 sandwich
4 has
5 become
6 a
7 staple
8 of
9 my
10 life
11 .
12 Mozzarella
13 ,
14 basil
15 ,
16 prosciutto
17 ,
18 roasted
19 red
20 peppers
21 and
22 balsamic
23 vinaigrette
24 blend
25 into
26 a
27 front
28 runner
29 for
30 the
31 best
32 sandwich
33 in
34 the
35 valley
36 .
37 Goes
38 great
39 with
40 sparkling
41 water
42 or
43 a
44 beer
45 .
46 47 DeFalco
48 's
49 also
50 has
51 other
52 Italian
53 fare
54 such
55 as
56 a
57 delicious
58 meatball
59 sub
60 and
61 classic
62 pastas
63 .
Token number 2: Purista
Token number 16: prosciutto
Token number 58: meatball

2 对所有的评论匹配

  • 每条评论里出现的 食谱(key):[stars 。。。](value),将分数加到列表里
from collections import defaultdict# item_ratings is a dictionary of lists. If a key doesn't exist in item_ratings,
# the key is added with an empty list as the value.
item_ratings = defaultdict(list) # 字典的值是listfor idx, review in data.iterrows():doc = nlp(review.text)# Using the matcher from the previous exercisematches = matcher(doc)# Create a set of the items found in the review textfound_items = set([doc[m[1]:m[2]].lower_ for m in matches])# Update item_ratings with rating for each item in found_items# Transform the item strings to lowercase to make it case insensitivefor item in found_items:item_ratings[item].append(review.stars)

3 最不受欢迎的菜

# Calculate the mean ratings for each menu item as a dictionary
mean_ratings = {name: sum(scores)/len(scores) for name,scores in item_ratings.items()}# Find the worst item, and write it as a string in worst_text. This can be multiple lines of code if you want.worst_item = sorted(mean_ratings, key=lambda x : mean_ratings[x])[0]
# After implementing the above cell, uncomment and run this to print 
# out the worst item, along with its average rating. print(worst_item)
print(mean_ratings[worst_item])

输出:

chicken cutlet
3.4

4 菜谱出现的次数

  • 每个菜有多少条评论
counts = {item: len(ratings) for item, ratings in item_ratings.items()}item_counts = sorted(counts, key=counts.get, reverse=True)
for item in item_counts:print(f"{item:>25}{counts[item]:>5}")

输出:

                    pizza  265pasta  206meatball  128cheesesteak   97cheese steak   76cannoli   72calzone   72eggplant   69purista   63lasagna   59italian sausage   53prosciutto   50chicken parm   50garlic bread   39gnocchi   37spaghetti   36calzones   35pizzas   32salami   28chicken pesto   27italian beef   25tiramisu   21italian combo   21ziti   21chicken parmesan   19chicken parmigiana   17portobello   14mac and cheese   11chicken cutlet   10steak and cheese    9pastrami    9roast beef    7fettuccini alfredo    6grilled veggie    6tuna salad    5turkey sandwich    5artichoke salad    5macaroni    5chicken salad    5reuben    4chicken spinach salad    2corned beef    2turkey breast    1
  • 打印出平均打分前十的 和 倒数10个的
sorted_ratings = sorted(mean_ratings, key=mean_ratings.get)print("Worst rated menu items:")
for item in sorted_ratings[:10]:print(f"{item:20} Ave rating: {mean_ratings[item]:.2f} \tcount: {counts[item]}")print("\n\nBest rated menu items:")
for item in sorted_ratings[-10:]:print(f"{item:20} Ave rating: {mean_ratings[item]:.2f} \tcount: {counts[item]}")

输出:

Worst rated menu items:
chicken cutlet       Ave rating: 3.40 	count: 10
turkey sandwich      Ave rating: 3.80 	count: 5
spaghetti            Ave rating: 3.89 	count: 36
italian beef         Ave rating: 3.92 	count: 25
tuna salad           Ave rating: 4.00 	count: 5
macaroni             Ave rating: 4.00 	count: 5
italian combo        Ave rating: 4.05 	count: 21
garlic bread         Ave rating: 4.13 	count: 39
roast beef           Ave rating: 4.14 	count: 7
eggplant             Ave rating: 4.16 	count: 69Best rated menu items:
chicken pesto        Ave rating: 4.56 	count: 27
chicken salad        Ave rating: 4.60 	count: 5
purista              Ave rating: 4.67 	count: 63
prosciutto           Ave rating: 4.68 	count: 50
reuben               Ave rating: 4.75 	count: 4
steak and cheese     Ave rating: 4.89 	count: 9
artichoke salad      Ave rating: 5.00 	count: 5
fettuccini alfredo   Ave rating: 5.00 	count: 6
turkey breast        Ave rating: 5.00 	count: 1
corned beef          Ave rating: 5.00 	count: 2

你对任何特定商品的数据越少,你就越不相信平均评级是客户的“真实”情绪。

我会把评分较低,且评价人数超过20个人的菜撤掉。


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
Michael阿明

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/473733.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Kaggle微课程】Natural Language Processing - 2.Text Classification

文章目录1. bag of words2. 建立词袋模型3. 训练文本分类模型4. 预测练习:1. 评估方法2. 数据预处理、建模3. 训练4. 预测5. 评估模型6. 改进learn from https://www.kaggle.com/learn/natural-language-processing NLP中的一个常见任务是文本分类。这是传统机器学…

Django框架—富文本编辑器

借助富文本编辑器,网站的编辑人员能够像使用offfice一样编写出漂亮的、所见即所得的页面此处以tinymce为例,其它富文本编辑器的使用也是类似的在虚拟环境中安装包 pip install django-tinymce2.6.0安装完成后,可以使用在Admin管理中&#xf…

Python基础(二)--数据类型,运算符与流程控制

目录 Python基础(二)--数据类型,运算符与流程控制 1 数据类型 1.1 Python中的数据类型 1.2 整数类型(int) 1.3 布尔类型 1.4 浮点类型 1.5 复数类型 1.6 类型转换 2 运算符 2.1 算术运算符 2.2 布尔运算符 …

【Kaggle微课程】Natural Language Processing - 3. Word Vectors

文章目录1. 词嵌入 Word Embeddings2. 分类模型3. 文档相似度练习:1. 使用文档向量训练模型2. 文本相似度learn from https://www.kaggle.com/learn/natural-language-processing 1. 词嵌入 Word Embeddings 参考博文:05.序列模型 W2.自然语言处理与词…

Django搜索工具——全文检索

全文检索不同于特定字段的模糊查询,使用全文检索的效率更高,并且能够对于中文进行分词处理haystack:全文检索的框架,支持whoosh、solr、Xapian、Elasticsearc四种全文检索引擎,点击查看官方网站whoosh:纯Py…

LeetCode 787. K 站中转内最便宜的航班(Dijkstra最短路径 + 优先队列)

文章目录1. 题目2. 解题1. 题目 有 n 个城市通过 m 个航班连接。每个航班都从城市 u 开始,以价格 w 抵达 v。 现在给定所有的城市和航班,以及出发城市 src 和目的地 dst,你的任务是找到从 src 到 dst 最多经过 k 站中转的最便宜的价格。 如…

Windows Phone 资源管理与换肤思考

Windows Phone 资源管理与换肤思考 原文 Windows Phone 资源管理与换肤思考 新入手一台Windows 8的笔记本,安装了VS2013后,终于又可以开发WP了。公司暂时不愿意开发WP,那么咱就自行研究吧! 在没有WP开发环境的时候,曾经…

Django完成异步工具——celery

情景:用户发起request,并等待response返回。在本些views中,可能需要执行一段耗时的程序,那么用户就会等待很长时间,造成不好的用户体验,比如发送邮件、手机验证码等使用celery后,情况就不一样了…

Python基础(三)--序列

Python基础(三)--序列 1 序列相关的概念 1.1 什么是序列 序列是一种可迭代对象,可以存储多个数据,并提供数据的访问。 序列中的数据称为元素,Python内置的序列类型有:列表(list)…

项目上线最后工作——布署环境

当项目开发完成后,需要将项目代码放到服务器上,这个服务器拥有固定的IP,再通过域名绑定,就可以供其它人浏览,对于python web开发,可以使用wsgi、apache服务器,此处以wsgi为例进行布署服务器首先…

Python基础(四)--字典与集合

Python基础(四)--字典与集合 1 字典 1.1 什么是字典 字典提供的是一种映射存储的方式。字典分为两个部分,一个是键(key),一个是key所关联的值(value)。,一个键关联&am…

[Kaggle] Spam/Ham Email Classification 垃圾邮件分类(spacy)

文章目录1. 导入包2. 数据预览2. 特征组合3. 建模4. 训练5. 预测练习地址:https://www.kaggle.com/c/ds100fa19 相关博文: [Kaggle] Spam/Ham Email Classification 垃圾邮件分类(RNN/GRU/LSTM) [Kaggle] Spam/Ham Email Classifi…

电商网站(Django框架)—— 大纲内容与基本功能分析

1. 项目架构 2. 数据库表结构 3. 数据库读写分离 4. Django读写分离配置 新建utils/db_router.py 课后阅读资料 http://python.usyiyi.cn/documents/django_182/topics/db/multi-db.html 5. 用户认证模型 注意: AUTH_USER_MODEL配置参数要在第一次迁移数据库之…

Python基础(五)--函数

目录 Python基础(五)--函数 1 函数的作用 1.1 函数定义与调用 1.2 函数的作用 1.3 空语句 2 参数与返回值 2.1 函数的参数 2.2 函数的返回值 2.3 返回多个值 3 参数的默认值 3.1 可选参数 3.2 参数的默认值 4 位置参数与关键字参数 4.1 关键…

LeetCode 1024. 视频拼接(动态规划/贪心)

文章目录1. 题目2. 解题2.1 动态规划2.2 贪心1. 题目 你将会获得一系列视频片段,这些片段来自于一项持续时长为 T 秒的体育赛事。这些片段可能有所重叠,也可能长度不一。 视频片段 clips[i] 都用区间进行表示:开始于 clips[i][0] 并于 clip…

电商网站(Django框架)—— 思维导图

1.用户模块:注册、登录、激活、退出、个人中心、地址 2.商品模块:首页、详情、列表、搜索 3.购物车: 增加、删除、修改、查询 4. 订单模块:确认订单页面、提交订单(下单)、请求支付、查询支付结果、评论 5.…

Python基础(六)--类与对象

目录 Python基础(六)--类与对象 1 类与对象的基本概念 1.1 什么是对象 1.2 什么是类 1.3 类与对象的关系 2 定义与初始化 2.1 类的定义 2.2 对象的初始化 2.3 动态增加属性方法 3 类成员 3.1 类属性与实例属性 3.2 类方法与实例方法 3.3 静态…

HTTP和HTTPS的请求和响应

HTTP协议(HyperText Transfer Protocol,超文本传输协议):是一种发布和接收 HTML页面的方法。 HTTPS(Hypertext Transfer Protocol over Secure Socket Layer)简单讲是HTTP的安全版,在HTTP下加入…

LeetCode 794. 有效的井字游戏(分类讨论)

文章目录1. 题目2. 解题1. 题目 用字符串数组作为井字游戏的游戏板 board。当且仅当在井字游戏过程中,玩家有可能将字符放置成游戏板所显示的状态时,才返回 true。 该游戏板是一个 3 x 3 数组,由字符 " ","X&quo…

Requests: 让 HTTP 服务人类

Requests支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动确定响应内容的编码,支持国际化的 URL 和 POST 数据自动编码。 Requests的文档非常完备,中文文档也相当不错。Requests能完全满足当前…