
Veganuary 一月吃素挑战!使用 Rubrix 进行命名实体识别
2022年2月4日
大家好!我是 Leire,今天我想和大家聊聊两个非常酷的话题:Veganuary(一月吃素挑战) 和 命名实体识别 (NER)。
在本文中,我们将更多地了解 NER,以及如何使用 Rubrix 处理这项任务。为此,由于 一月 刚刚结束,我们选择了一个非常合适且有趣的主题:Veganuary(一月吃素挑战)!。
但首先,我必须感谢 David 的帮助和贡献,特别是在 Hugging Face 模型方面的帮助。查看他的 Github 个人资料!
简介...
在开始之前,最好先简单解释一下 Veganuary(一月吃素挑战) 和 NER
- 命名实体识别 是一项 自然语言处理任务,通过它可以识别和命名 文本序列 中的 实体。这些实体被分为不同的组,例如 名称、地点、事件、货币 等等。如果您想了解更多关于 NER 和一般的 token 分类 的信息,您可以阅读 Hugging Face 团队撰写的这篇非常有趣的文章。
- Veganuary(一月吃素挑战) 是一项非常著名的挑战(尤其是在英语国家),根据 维基百科,“它通过鼓励人们在一月份遵循纯素生活方式来推广和教育人们关于纯素主义的知识”。
...和目标
人们一直在他们的社交网络上发布内容。在一月份(或者我应该说是 Veganuary?),参加挑战的人们通常会发布他们吃的 纯素食物。并且他们会写一段文字说明。所以我们想,“我们可以探索 Twitter,看看人们如何评价 Veganuary 餐和纯素食品趋势,并做一个 NER 任务!!”。
说干就干!为了我们严谨的分析 😉,我们计划从人们在 Veganuary 期间发布的约 1 万条推文 中提取所有与食物相关的提及,并简单地查看一下。因此,在本文中,我们将带您了解我们的小实验,并展示我们获得的(有点令人惊讶?)结果 🤩。
过程
要完成这项任务,需要四个步骤
- 从 Twitter 检索推文
- 预处理和标记化推文
- 使用 Rubrix 注释推文
- 训练 Hugging Face 模型 并进行预测
1. 从 Twitter 检索推文
推文的最大长度为 280 个字符,似乎很方便处理。它们也比冗长的文档更容易注释。我们使用 searchtweets 来检索 Veganuary 1 月 11 日至 18 日期间包含以下主题标签之一的所有推文
#veganfood, #veganideas, #veganrecipes, #veganuary, #veganuary2022
为了让我们的生活更轻松一些 😌,我们丢弃了所有转发和回复。这为我们留下了大约 7900 条推文,用于我们的小实验。
2. 预处理和标记化推文
在我们获得必要的数据后,Rubrix 登场了。
我们预处理了推文,替换了 URL、用户和表情符号,以便模型可以专注于推文的实际文本。为此,我们使用了出色且实用的 pysentimiento 库。
由于我们想要执行 token 分类任务(NER 是其中之一),我们使用令人惊叹的 spaCy 库 对推文进行了标记化。SpaCy 附带许多预训练的 pipeline,支持多种语言和任务,例如 词性标注、文本分类 或 NER。
最后,我们创建了 Rubrix 记录,提供了文本和 token。
import spacyimport pandas as pdfrom pysentimiento.preprocessing import preprocess_tweet# read in the tweetstweets = pd.read_json('tweets.json')# we use spaCy to tokenize our datanlp = spacy.load("en_core_web_sm")# iterate over tweets, and save them as Rubrix recordsrecords = []for tweet in tweets.iterrows(): # preprocess tweets (substitute urls, users, emojis) text = preprocess_tweet(tweet.text, lang="en") # tokenize the text tokens = [token.text for token in nlp(text)] # create Rubrix record, and add it to the list record = rb.TokenClassificationRecord(text=text, tokens=tokens) records.append(record)
在几分钟内为我们的 7899 条推文 创建记录后,我们准备将它们记录到 Rubrix
# log records to a dataset called "veganuary"rb.log(records=records, name="veganuary")
瞧! 大量预处理和标记化的推文被上传到 Rubrix,准备好被注释了!🍾📝
3. 注释推文
在 Rubrix 的帮助下,我们在几个小时内手动注释了 7899 条记录中的 500 条(实际上是 501 条 🤪)。为此,我们创建了标签“FOOD”。在此之后,我们注释了在记录中找到的每个 食物实体。
这是一个非常好的例子
我们获得了 501 个注释,结果很有趣(见下文)。这不仅让我们更深入地了解了数据,而且对于训练 模型 以便对剩余的推文进行预测也是必要的。
需要指出的是一个负面事实:我们处理了大量的 垃圾邮件 和 广告。有些记录似乎是垃圾邮件或广告,因此可能会在显示“流行产品”方面对结果产生偏差。
4. 训练 Hugging Face 模型 并进行预测
在完成所有必要的注释后,我们想要训练一个 Hugging Face transformer 🤗。由于这是一个更复杂的阶段,我将简要解释一下。
首先,有人可能会想:什么是 transformer?Transformer 是一种特定的模型,通常是预训练的,因此需要更少的数据进行训练(在这种情况下,更确切地说是微调)。令人惊叹的 Hugging Face Hub 提供了数千个在不同语言和任务上预训练的 transformer 模型。
为了训练我们的 veganuary 模型,我们选择了 twitter-roberta-base 模型,该模型在近 6000 万条推文上进行了预训练 🤯。
但在训练 transformer 之前,我们需要从 Rubrix 加载数据集和我们的注释。我们还需要将注释转换为另一种称为 NER 标签 的格式:虽然 Rubrix 仅以 文本跨度 的形式表达注释,但对于训练,我们还需要考虑这些文本跨度包含哪些 token。如果您想了解更多关于 NER 标签 的信息,我们推荐这篇简短但简洁的 维基百科文章。
from spacy.training import offsets_to_biluo_tags, biluo_to_iob# Load only the annotated records from Rubrixtweets = rb.load('veganuary', query="status:Validated")# transform text spans to ner tags (BIO format)def spans_to_tags(row): doc = nlp(row["text"]) entities = [(entity[1], entity[2], entity[0]) for entity in row['annotation']] biluo_tags = offsets_to_biluo_tags(doc, entities) return biluo_to_iob(biluo_tags)tweets["ner_tags"] = tweets.apply(spans_to_tags, axis=1)
在我们的 NER 标签准备就绪后,我们终于可以按照 Hugging Face 团队提供的这个非常 全面的教程 来训练我们的模型 🤗。
训练结束后,我们在 Hugging Face pipeline 中使用了我们的模型,以提取我们的 veganuary 推文中的所有食物提及。您已经好奇哪种食物被提及最多了吗?😎
数据集:结果、发现和思考
所以,废话不多说,这是 前 20 种食物提及 的列表
食物 | 计数 |
---|---|
肉 | 488 |
奶酪 | 136 |
乳制品 | 116 |
牛奶 | 104 |
披萨 | 84 |
豆腐 | 83 |
巧克力 | 77 |
肉 | 75 |
米饭 | 65 |
汉堡 | 62 |
蔬菜 | 57 |
鸡肉 | 56 |
沙拉 | 48 |
鱼 | 47 |
大蒜 | 46 |
汤 | 45 |
蘑菇 | 43 |
汉堡 | 41 |
意大利面 | 40 |
蛋糕 | 39 |
前 10 种食物从 肉 🥩 到 鸡肉 🍗 不等,但接下来的食物也值得注意。首先,在 注释 和 预测 过程中,肉 是主要的实体。
为什么?也许是因为很多 纯素产品 都在模仿肉类——这是一个文化问题,而且 Beyond Burgers 无论如何都很逼真而且美味——,也许这些推文上存在某种形式的行动主义。毕竟,纯素主义与政治有关,也与食物有关。这同样适用于 奶酪 🧀 或 牛奶 🥛 等词语实体。其他结果,如 豆腐 🍢、蔬菜 🍆 或 米饭 🍚 似乎很合乎逻辑,而 披萨 🍕、意大利面 🍝 或 汉堡 🍔 可能显示了纯素美食的趋势。
此外,在这两个过程中,我们都注意到了一场“战斗”:肉 和 豆腐 是最常见的实体之一。因此,似乎有些人试图尝试将纯素烹饪适应传统烹饪,而另一些人则坚持纯素主食(即 豆腐、米饭、蘑菇 🍄 ...)。
当然,还有更多方面需要讨论,但我们想知道你们的想法!👀。
总结
通过这个实验,我们一石二鸟 🐦 🤯:我们做了一个超级有趣的 NER 任务,并且我们学到了很多关于 Veganuary(一月吃素挑战) 和 纯素食物 的知识。
借助 Rubrix 功能,我们可以在短时间内轻松地注释和预测大量记录。
如果您想重现我们的结果,这是 repo 💻,您可以在其中找到您需要的所有数据和 notebook! 我们还 开源了 数据 💾,并 创建了一个 简单的应用程序 ✨,因此您可以自己从推文中提取食物提及。
希望您觉得这很有趣。命名实体识别 有很多用途!