小余同学's Bolg - 读书笔记
type: channel
link: https://ilfishs.com/category/NLP_reading_notes/
description: 这个分类是记录小余同学阅读自然语言处理相关书籍的笔记。
items: 第十届“泰迪杯”数据挖掘挑战赛：疫情背景下的周边游需求图谱分析-国二方案分享(2)
items: 《自然语言处理基于预训练模型的方法》- 第5章 静态词向量预训练模型「学习笔记」
items: 《自然语言处理基于预训练模型的方法》- 第2章 自然语言处理基础 「学习笔记」

第十届“泰迪杯”数据挖掘挑战赛：疫情背景下的周边游需求图谱分析-国二方案分享(2)
type: item
date: 2023-04-12T20:59:00+08:00
description: 第十届“泰迪杯”数据挖掘挑战赛C题 -疫情背景下的周边游需求图谱分析 第2问和第3问 产品热度计算方法第一问分享在下列链接：[post cid="161" cover="" size=""/][scode type="green" size="simple"]我已在AIStudio将赛题方案上传，可以一键Fork运行。步骤：未注册的小伙伴需要先去AI Studio进行注册，完善资料后，访问下面方案链接（觉得好的话，记得给我点个关注和小红心哦）：问题一解决方案代码问题二、三解决方案代码由于该赛题方案内容太多，故将1问和2、3问分开分享竞赛地址：https://www.tipdm.org:10010/#/competition/1481159137780998144/question[/scode]一、项目介绍1.1 赛题背景1.2 第二问拟解决的问题 周边游产品热度分析1.3 第三问拟解决的问题 本地旅游图谱构建与分析二、方案设计2.1 赛题背景2.2 第二问拟解决的问题 周边游产品热度分析三、基于SKEP的周边游产品热度评价3.1 评论观点抽取模型3.2 属性级情感分类模型3.3 全流程模型推理四、 计算产品热度4.1 方面级情感极性预测及计算情感分数4.2统计产品情感热度得分五、致谢一、 项目介绍1.1 赛题背景随着互联网和自媒体的繁荣，文本形式的在线旅游（Online Travel Agency，OTA）和游客的用户生成内容（User Generated Content，UGC）数据成为了解旅游市场现状的重要信息来源。OTA和UGC数据的内容较为分散和碎片化，要使用它们对某一特定旅游目的地进行研究时，迫切需要一种能够从文本中抽取相关的旅游要素，并挖掘要素之间的相关性和隐含的高层概念的可视化分析工具。为此本赛题提出本地旅游图谱这一概念，它在通用知识图谱的基础上加入了更多针对旅游行业的需求。本地旅游图谱采用图的形式直观全面地展示特定旅游目的地“吃住行娱购游”等旅游要素，以及它们之间的关联。图 1所示为我国西藏阿里地区的本地旅游图谱，中心位置节点为旅游目的地“阿里”，它的下层要素包括该地区的重要景点如“冈仁波齐”和“玛旁雍错”，以及“安全”、“住宿”等旅游要素。旅游要素分为多个等级，需要从文本中挖掘出面对不同要素游客所关注的下一级要素。如阿里地区的“安全”要素下包括“高反”、“天气”和“季节”等下一级要素，这个组合是西藏旅游所特有的。旅游要素之间会存在关联关系，如“冈仁波齐”和“玛旁雍错”这两个景点通过“神山圣湖”这一高层概念产生联系，在本地旅游图谱中使用连接两个节点的一条边来表示。在近年来新冠疫情常态化防控的背景下，我国游客的旅游消费方式已经发生明显的转变。在出境游停滞，跨省游时常因为零散疫情的影响被叫停的情况下，中长程旅游受到非常大的冲击，游客更多选择短程旅游，本地周边游规模暴涨迎来了风口。疫情防控常态化背景下研究分析游客消费需求行为的变化，对于旅游企业产品供给、资源优化配置以及市场持续开拓具有长远而积极的作用。本赛题提供收集自互联网公开渠道的2018年至2021年广东省茂名市的OTA和UGC数据，期待参赛者采用自然语言处理等数据挖掘方法通过建立本地旅游图谱的方式来分析新冠疫情时期该市周边游的发展。1.2 第二问拟解决的问题 周边游产品热度分析从附件提供的OTA、UGC数据中提取包括景区、酒店、网红景点、民宿、特色餐饮、乡村旅游、文创等旅游产品的实例和其他有用信息，将提取出的旅游产品和所依托的语料以表2的形式保存为文件“result2-1.csv”。建立旅游产品的多维度热度评价模型，对提取出的旅游产品按年度进行热度分析，并排名。将结果以表3的形式保存为文件“result2-2.csv”。1.3 第三问拟解决的问题 本地旅游图谱构建与分析依据提供的OTA、UGC数据，对问题2中提取出的旅游产品进行关联分析，找出以景区、酒店、餐饮等为核心的强关联模式，结果以表4的形式保存为文件“result3.csv”。在此基础上构建本地旅游图谱并选择合适方法进行可视化分析。鼓励参赛队挖掘旅游产品间隐含的关联模式并进行解释。二. 方案设计C题第二问通过构建基于 SBERT 的旅游产品提取模型，对旅游攻略及微信公众号进行产品抽取，再针对情感热度问题，构建基于迁移学习与细粒度情感分析的情感热度分析模型，得出每个产品的情感分数，最终利用情感分数以及年度的产品频次按照自定的产品热度公式进行计算，最终生成年度产品热度。本实践的解决方案采用skep模型，大致分为两个环节，首先需要进行评论观点抽取，接下来，便可以根据该评论观点去分析相应观点的情感极性。2.1 评论观点抽取在本实践中，我们将采用序列标注的方式进行评论观点抽取，具体而言，会抽取评论中的属性以及属…

《自然语言处理基于预训练模型的方法》- 第5章 静态词向量预训练模型「学习笔记」
type: item
date: 2022-06-23T09:10:00+08:00
description: 情感分类实战词表映射Vocabfrom collections import defaultdict # 词表映射 class Vocab: def __init__(self, tokens=None): # 索引对应token的列表 self.idx_to_token = list() # token和索引的词典 self.token_to_idx = dict() if tokens is not None: # 在tokens列表后加标记<unk>来分辨未登录词 if '<unk>' not in tokens: tokens = tokens + ['<unk>'] for token in tokens: self.idx_to_token.append(token) # 下标从0开始 self.token_to_idx[token] = len(self.idx_to_token) - 1 self.unk = self.token_to_idx['<unk>'] @classmethod def build(cls, text, min_freq=1, reserved_tokens=None): # 若查找不存在，返回0 token_freqs = defaultdict(int) for sentence in text: for token in sentence: token_freqs[token] += 1 # 不重复tokens列表 uniq_tokens = ['<unk>'] + (reserved_tokens if reserved_tokens else []) uniq_tokens += [token for token, freq in token_freqs.items() if freq >= min_freq and token != '<unk>'] return cls(uniq_tokens) def __len__(self): # 返回词表的大小，即此表中有多少个互不相同的标记 return len(self.idx_to_token) def __getitem__(self, item): # 查找输入标记对应的索引值，如果该标记不存在，则返回标记<unk>的索引值（0） return self.token_to_idx.get(item, self.unk) def convert_token_to_idx(self, tokens): # 查找一系列输入标记对应的索引值 return [self.token_to_idx[token] for token in tokens] def convert_idx_to_token(self, idxs): # 查找一系列索引值对应的标记 return [self.idx_to_token[idx] for idx in idxs]Embedding层将一个词（或者标记）转换为一个低维、稠密、连续的词向量（也称Embed-ding）是一种基本的词表示方法，通过torch.nn包提供的Embedding层即可实现该功能。创建Embedding对象时，需要提供两个参数，分别是num_embeddings，即词表的大小；以及embedding_dim，即Embedding向量的维度。embedding = nn.Embedding(8,3) # 词表大小为8，Embedding向量维度为3 input = torch.tensor([[0,1,2,1],[4,6,6,7]], dtype=torch.long) # 输入形状为(2,4)的整数张量（相当于两个长度为4的整数序列） # 其中每个整数范围在0-7 output = embedding(input) #调用Embedding对象 print(output) # 输出结果，其中将相同的整数映射为相同的向量融入词向量层的MLPimport torch from torch import nn from torch.nn import functional as F class MLP(nn.Module): def __init__(self, vocab_size, embedding_dim, hidden_dim, num_class): super(MLP, self).__init__() """ 词袋（Bag-Of-Words，BOW）模型解决该问题。 词袋模型指的是在表示序列时，不考虑其中元素的顺序， 而是将其简单地看成是一个集合""" # 词嵌入层 self.embedding = nn.Embedding(vocab_size, embedding…

《自然语言处理基于预训练模型的方法》- 第2章 自然语言处理基础 「学习笔记」
type: item
date: 2022-06-21T16:19:00+08:00
description: 书名：自然语言处理：基于预训练模型的方法文本的表示独热编码表示独热编码，就是使用一个词表的大小的向量表示一个词的“语义”，然后第i个词用wi表示。词表中第i个词在第i维上被设置为1，其余维均为0。词的分布式表示由于用独热编码表示词汇导致数据过于稀疏和庞大。因此John RupertFirth于1957年提出了分布式语义假设：词的含义可由其上下文的分布进行表示。我们将以词为单位的其它词语作为上下文，因此创建下列共现频次表。除了词，上下文的选择有很多种方式，而选择不同的上下文得到的词向量表示性质会有所不同。例如，可以使用词在句子中的一个固定窗口内的词作为其上下文，也可以使用所在的文档本身作为上下文。前者得到的词表示将更多地反映词的局部性质：具有相似词法、句法属性的词将会具有相似的向量表示。而后者将更多地反映词代表的主题信息。直接使用与上下文的共现频次作为词的向量表示，至少存在以下三个问题：高频词往往没有什么作用，反而会影响计算机国。如"我" "。"的共现频次很高，实际上可能它们并没有关系但由于共现过，从而产生了较高的相似度。共现频次无法反映词之前的高阶关系。假设词“A”与“B”共现过，“B”与“C”共现过，“C”与“D”共现过，通过共现频次，只能获知“A”与“C”都与“B”共现过，它们之间存在一定的关系，而“A”与“D”这种高阶的关系则无法知晓。仍然存在稀疏性的问题。即向量中仍有大量的值为0解决高频词误导计算结果的问题点互信息由于共矩阵仍然存在稀疏性的问题。即向量中仍有大量的值为0。最直接的想法就是：如果一个词与很多词共现，则降低其权重；反之，如果一个词只与个别词共现，则提高其权重。信息论中的点互信息（Pointwise Mutual Information，PMI）恰好能够做到这一点。对于词w和上下文c，其PMI为：式中，P （w， c）、P （w）、P （c）分别是w与c的共现概率，以及w和c分别出现的概率。可见，通过PMI公式计算，如果w和c的共现概率（与频次正相关）较高，但是w或者c出现的概率也较高（高频词），则最终的PMI值会变小；反之，即便w和c的共现概率不高，但是w或者c出现的概率较低（低频词），则最终的PMI值也可能会比较大。从而较好地解决高频词误导计算结果的问题。当某个词与上下文之间共现次数较低时，可能会得到负的PMI值。考虑到这种情况下的PMI不太稳定（具有较大的方差），在实际应用中通常采用PPMI （Positive PMI）的形式，即：奇异值分解解决共现频次无法反映词之间高阶关系的问题。相关的技术有很多，对共现矩阵M进行奇异值分解。词的分布式表示取得了不错的效果，但是其仍然存在一些问题。当共现矩阵规模较大时，奇异值分解的运行速度非常慢；如果想在原来语料库的基础上增加更多的数据，则需要重新运行奇异值分解算法，代价非常高；分布式表示只能用于表示比较短的单元，如词或短语等，如果待表示的单元比较长，如段落、句子等，由于与其共现的上下文会非常少，则无法获得有效的分布式表示；最后，分布式表示一旦训练完成，则无法修改，也就是说，无法根据具体的任务调整其表示方式。为了解决这些问题，可引入一种新的词表示方式——词嵌入表示。词嵌入表示(Word Embedding)使用一个连续、低维、稠密的向量来表示词，经常直接简称为词向量词向量中的向量值，是随着目标任务的优化过程自动调整的，也就是说，可以将词向量中的向量值看作模型的参数词袋表示所谓词袋表示，就是假设文本中的词语是没有顺序的集合，将文本中的全部词所对应的向量表示（既可以是独热表示，也可以是分布式表示或词向量）相加，即构成了文本的向量表示。如在使用独热表示时，文本向量表示的每一维恰好是相应的词在文本中出现的次数。nlp任务语言模型(统计语言模型）N元语言模型基本任务是在给定词序列w1w2··· wt−1的条件下，对下一时刻t可能出现的词wt的条件概率P （wt|w1w2···wt−1）进行估计。一般地，把w1w2··· wt−1称为wt的历史。随着句子长度增加，w1：i−1出现的次数会越来越少，甚至从未出现过，那么P （wi|w1：i−1）则很可能为0，此时对于概率估计就没有意义了。为了解决该问题，可以假设“下一个词出现的概率只依赖于它前面n−1个词”。马尔可夫假设N-gram ：N 元语言模型马尔可夫假设 : 满足该假设称为：N元语法或文法(gram)模型n=1 的 unigram 独立于历史(之前的序列)，因此语序无关n=2 的 bigram 也被称为一阶马尔可夫链w0 可以是 ，可以是平滑： 解决未登录词 (OOV, Out-Of-Vocabulary, )的零概率问题折扣法 ：高频补低频(频繁出现的N-gram中匀出一部分概率并分配给低频次（含零频次）的N-gram)加…