细粒度情感分析:了解文本情感的What、How、Why
Knowing What,How and Way:A Near Complete Solution for Aspect-based Sentiment Analysis

论文地址:https://arxiv.org/pdf/1911.01616.pdf

一、细粒度情感分析

​ 细粒度情感分析任务ABSA(Aspect Based Sentiment Analysis)的目标是解决各类情感分析任务,其包括任务ATE(Aspect Term Extraction)、OTE(Opinion Term Extraction)和ATC(Aspect Term Sentiment Classification)。举例说明一下这些任务。给定一个例句
Waiters are very friendly and the pasta is simply average.\text{Waiters are very friendly and the pasta is simply average.} Waiters are very friendly and the pasta is simply average.
ATE的目标是抽取Waiters\text{Waiters}Waiterspasta\text{pasta}pasta,ATC的目标是为ATE抽取出的aspect进行情感分类,OTE是抽取导致情感极性的词friendly\text{friendly}friendlyaverage\text{average}average

​ 虽然这几个任务看起来容易混淆,但是任务边界其实十分清晰。如下图所示,顶上的三个正方形表示ABSA的三个目标,其中aspect term表示需要句子中要目前讨论的目标(waiter),opinion term表示评论观点的术语或者短语(friendly),aspect category表示将aspect分类到预先定义的类别,例如“服务”或者“食物”。

​ 中间层的圆圈表示具体的子任务。研究人员认为独立去解决这些子任务是不够的,提出了两两成对解决这些子任务。但是,这样仍然不足以完成的描绘出整个情感的状态。例如,先前的例子中,能够确定waiters\text{waiters}waiters是正向情感,但是无法给出为什么是正向的线索,只有确定了friendly\text{friendly}friendly,才能真正理解导致情感正向的原因。Fan等人提出给定aspect,抽取对应opinion term的任务,该任务并不会预测情感。联合抽取aspect和opinion的任务也并不能解决二者间配对的问题。aspect抽取和情感分类联合任务中不能为aspect抽取opinion term。综合分析这些子任务的缺陷,论文提出了新的子任务ASTE(Aspect Sentiment Triplet Extraction),其在所有子任务中的位置如下图中的实心圆。

二、方法简介

​ 新子任务ASTE,该任务的目标是从句子中抽取三元组(What,How,Why),其中What表示aspect,How表示情感极性,Why表示为什么具有这样的情感极性。例如从句子“Waiters are very friendly and the pasta is simply average”中抽取三元组(Waiters, positive, friendly)。

​ 论文针对任务ASTE,提出了一种两阶段框架的解决方案。第一阶段,提取aspect term、opinion term以及判断情感极性。这个阶段会将任务转换为两个序列标注任务,一个序列标注任务用来确定aspect term及其情感极性,另一个序列标注则是用来确定opinion term。第二阶段,将aspect和opinion进行配对。

三、问题的形式化

​ 给定一个长度为TTT的句子X={x1,…,xT}X=\{x_1,\dots,x_T\}X={x1,,xT},ASTE的任务是抽取情感三元组。

​ 首先,会将aspect抽取及情感极性判断转换为一个统一的序列标注任务,标注的标签为YTS=\mathcal{Y}^{\mathcal{TS}}=YTS={B-POS, I-POS, E-POS, S-POS, B-NEG, I-NEG, E-NEG, S-NEG, B-NEU, I-NEU, E-NEU, S-NEU, O}。句子XXX在这个统一的序列标注任务中会得到预测标签YTS={y1TS,…,yTTS},yiTS∈YTSY^{\mathcal{TS}}=\{y_1^{\mathcal{TS}},\dots,y_T^{\mathcal{TS}}\},y_i^{\mathcal{TS}}\in\mathcal{Y}^{\mathcal{TS}}YTS={y1TS,,yTTS},yiTSYTS

​ 其次,opinion抽取也会转换为序列标注任务,标注标签为YOPT={B,I,E,S}∪{O}\mathcal{Y}^{\mathcal{OPT}}=\{\text{B,I,E,S}\}\cup\{O\}YOPT={B,I,E,S}{O},对应于句子XXX的预测标签为YOPT={y1OPT,…,yTOPT},yiOPT∈YOPTY^{\mathcal{OPT}}=\{y_1^{\mathcal{OPT}},\dots,y_T^{\mathcal{OPT}}\},y_i^{\mathcal{OPT}}\in\mathcal{Y}^{\mathcal{OPT}}YOPT={y1OPT,,yTOPT},yiOPTYOPT

​ 最后,前面2个序列标注任务会得到aspect集合{T1,T2,…,Tn}\{T_1,T_2,\dots,T_n\}{T1,T2,,Tn}和opinion集合{O1,O2,...,Om}\{O_1,O_2,...,O_m\}{O1,O2,...,Om}。然后,两两配对得到aspect-opinion对集合{(T1,O1),(T1,O2),...,(Tn,Tm)}\{(T_1,O_1),(T_1,O_2),...,(T_n,T_m)\}{(T1,O1),(T1,O2),...,(Tn,Tm)},然后从中选出正确的aspect-opinion对。

1. 抽取apsect并判断情感;2. 抽opinion;3. 判断aspect-opinion对

四、模型概览

​ 上图是整个模型的结构,其是一个两阶段的框架。第一阶段会预测两种类型的标签,分别是apsect边界和情感极性的统一标签YTS\mathcal{Y}^{\mathcal{TS}}YTS和opinion边界标签YOPT\mathcal{Y}^{\mathcal{OPT}}YOPT。具体来说,左边的模型包含两个堆叠的BiLSTM,用于预测YTS\mathcal{Y}^{\mathcal{TS}}YTS。下面的BiLSTM用于执行一个预测apsect的辅助任务,并将产生的辅助信号传递给上面的BiLSTM,上面的BiLSTM用于保证情感的连接性,并最终使用BG组件将所有的信息进行汇合后来预测统一标签。第一阶段右边的模型用于预测opinion的边界,即YOPT\mathcal{Y}^{\mathcal{OPT}}YOPT。整个句子会输入至GCN中,并通过aspect和opinion的依赖关系进行学习。然后,学习到的向量分别被输入至2个不同的模块TG\text{TG}TGBiLSTMOPT\text{BiLSTM}^{OPT}BiLSTMOPT,TG模块会结合aspect的边界信息来预测opinion的边界,BiLSTMOPT\text{BiLSTM}^{OPT}BiLSTMOPT则直接预测opinion的边界。

​ 第二阶段会基于第一阶段抽取的aspect和opinion来枚举所有可能的aspect-opinion对,然后基于apsect和opinion的相对距离来产生position embedding,利用BiLSTM编码后能够分别得到apsect和opinion的向量,将两者向量进行拼接后输入二分类器即可。

五、第一阶段

1. aspect抽取和情感极性判断

​ 在上面“问题的形式化”中,将aspect抽取和情感判断转换成了统一标签YTS\mathcal{Y}^{\mathcal{TS}}YTS并使用序列标注进行解决。论文认为预测aspect的边界有助于预测整个统一标签YTS\mathcal{Y}^{\mathcal{TS}}YTS,因此会使用一个称为BiLSTMTBiLSTM^{\mathcal{T}}BiLSTMT的双向LSTM来预测apsect的边界,预测的结果YT\mathcal{Y}^\mathcal{T}YT{B,I,E,S,O}\{B,I,E,S,O\}{B,I,E,S,O},且模型BiLSTMTBiLSTM^{\mathcal{T}}BiLSTMT隐藏层的输出表示为hT=[LSTM→T(x);LSTM←T(x)]h^{\mathcal{T}}=[\text{LSTM}_{\rightarrow}^{\mathcal{T}}(x);\text{LSTM}_{\leftarrow}^{\mathcal{T}}(x)]hT=[LSTMT(x);LSTMT(x)]。随后,hTh^{\mathcal{T}}hT会被输入着一个称为BiLSTMS\text{BiLSTM}^SBiLSTMS的双向LSTM来预测标签YS\mathcal{Y}^{\mathcal{S}}YS,其隐藏层输出为hs=[LSTM→S(x);LSTM←S(x)]h^s=[\text{LSTM}_{\rightarrow}^{S}(x);\text{LSTM}_{\leftarrow}^{S}(x)]hs=[LSTMS(x);LSTMS(x)]YS\mathcal{Y}^{\mathcal{S}}YS={B-POS, I-POS, E-POS, S-POS, B-NEG, I-NEG, E-NEG, S-NEG, B-NEU, I-NEU, E-NEU, S-NEU}。(简单总结,第一层BiLSTM预测边界YT\mathcal{Y}^\mathcal{T}YT,隐藏层输出hTh^{\mathcal{T}}hT,第二层BiLSTM输入hTh^{\mathcal{T}}hT来预测YS\mathcal{Y}^{\mathcal{S}}YS,隐藏层输出为hsh^shs。预测YT\mathcal{Y}^\mathcal{T}YT是为了让预测YS\mathcal{Y}^{\mathcal{S}}YS的边界时更加准确。)

​ 通常一个apsect是由多个token组成的,为了避免预测YS\mathcal{Y}^{\mathcal{S}}YS时,多个token的情感不一致。因此,这里会通过gate机制实现一个称为Sentiment Consistency(SC)模块(BiLSTM机制包含三个gate,这里的gate感觉上有点多余)
gt=σ(WghtS+b)h~tS=gt⊙htS+(1−gt)⊙h~t−1S\begin{aligned} &g_t=\sigma(\textbf{W}^gh_t^{S}+\textbf{b})\\ &\tilde{h}_t^S=g_t\odot h_t^S+(1-g_t)\odot\tilde{h}_{t-1}^S \end{aligned} gt=σ(WghtS+b)h~tS=gthtS+(1gt)h~t1S
其中, Wg\textbf{W}^gWgbg\textbf{b}^gbg是SC模块的模型参数,⊙\odot是element-wise乘法,σ\sigmaσ是sigmoid函数。通过该gate可以降低情绪标签剧烈变化的风险。

​ 前面的BiLSTMTBiLSTM^{\mathcal{T}}BiLSTMT会预测aspect的边界YT\mathcal{Y}^\mathcal{T}YT并得到hTh^{\mathcal{T}}hT,若希望基于YT\mathcal{Y}^\mathcal{T}YT来预测YS\mathcal{Y}^{\mathcal{S}}YS,那么YT\mathcal{Y}^\mathcal{T}YT中的标签会有三种转换情况。举例来说,若BiLSTMTBiLSTM^{\mathcal{T}}BiLSTMT在某个位置预测的标签是B,那边该标签转换后的结果一定是B-POS、B-NEG、B-NEU中的一个。因此,这里使用一个基于转移矩阵实现的Boundary Guidance(BG)模块。该模块中存在一个可训练的转移矩阵Wtr∈R∣YT∣×∣YS∣\textbf{W}^{tr}\in\mathbb{R}^{|\mathcal{Y}^{\mathcal{T}}|\times |\mathcal{Y}^{\mathcal{S}}|}WtrRYT×YS,其中某一个具体取值Wi,jtr\textbf{W}_{i,j}^{tr}Wi,jtr表示从标签YTi\mathcal{Y}^{\mathcal{T}_i}YTi转移至标签YSj\mathcal{Y}^{\mathcal{S}_j}YSj的概率。具体的过程为
ztT=p(ytT∣xt)=Softmax(WThtT)ztS′=(Wtr)⊤ztT\begin{aligned} & z_t^{\mathcal{T}}=\textbf{p}(y_t^{\mathcal{T}}|x_t)=\text{Softmax}(\textbf{W}^\mathcal{T}h_t^{\mathcal{T}})\\ & z_t^{S'}=(\textbf{W}^{tr})^\top z_t^{\mathcal{T}} \end{aligned} ztT=p(ytTxt)=Softmax(WThtT)ztS=(Wtr)ztT
其中,WT\textbf{W}^{\mathcal{T}}WT是可训练参数,ztS′z_t^{S'}ztS是获得的统一标签概率分布。(ztS′z_t^{S'}ztS不是最终的统一标签概率,只是其中一部分,之后还会进行一个合并。)

ztS′z_t^{S'}ztS在预测统一标签时并没有合并opinion的信息,显然opinion信息对于预测apsect的位置会有很大的帮助。因此这里会将带有opinion信息的向量hOPTh^{\mathcal{OPT}}hOPT(后面会介绍怎么得到该向量)和h~tS\tilde{h}_t^Sh~tS进行拼接合并,得到一个更强大的向量hUh^\mathcal{U}hU,然后基于hUh^\mathcal{U}hU在预测一次统一标签的概率分布,
ztS=p(ytS∣xt)=Softmax(WShtU)z_t^S=\textbf{p}(y_t^S|x_t)=\text{Softmax}(\textbf{W}^Sh_t^{\mathcal{U}}) ztS=p(ytSxt)=Softmax(WShtU)
​ 现在,有两个统计标签的预测概率,分布是ztSz_t^SztSztS′z_t^{S'}ztS,现在讨论怎么将两者结合在一起。这里希望学习到一个权重,两者按这个权重进行加权求和。

​ 这里的权重分αt∈R\alpha_t\in\mathbb{R}αtR的计算是基于称为apsect边界集中度分ctc_tct,具体来说
ct=(ztT)⊤ztTαt=ϵct\begin{aligned} c_t=(z_t^{\mathcal{T}})^{\top}z_t^{\mathcal{T}} \\ \alpha_t=\epsilon c_t \end{aligned} ct=(ztT)ztTαt=ϵct
其中,ctc_tct是一个0到1的值,其越大表示模型在预测边界时的置信度越高,ϵ\epsilonϵ是一个超参数。

​ 最终预测统一标签的概率分布为
ztTS=αtztS′+(1−αt)ztSz_t^{\mathcal{TS}}=\alpha_t z_t^{\mathcal{S'}}+(1-\alpha_t)z_t^{\mathcal{S}} ztTS=αtztS+(1αt)ztS

2. opinion 抽取

​ 前面介绍了aspect抽取和情感极性判断,这里会介绍opinion抽取的内容。此外,前面在预测ztSz_t^SztS时,使用了hOPTh^{\mathcal{OPT}}hOPT,因此本部分也会介绍该向量的由来。

​ 先前的一些研究表明aspect抽取和opinion抽取是互利的,而且直观上也能够判断aspect和opinion是经常共现的。因此,这里希望利用apsect的信息来指导opinion的抽取。具体来说,这里会将句子进行embedding,然后输入至GCN中来学习不同词之间的依赖。GCN的邻接矩阵是基于句子的依赖解析构造的,称为WGCN∈R∣L∣×∣L∣\textbf{W}^{GCN}\in\mathbb{R}^{|\mathcal{L}|\times |\mathcal{L}|}WGCNRL×L,其中L\mathcal{L}L是句子的长度。例如,第iii个单词和第jjj个单词具有依赖关系,那么Wi,jGCN\textbf{W}^{GCN}_{i,j}Wi,jGCNWj,iGCN\textbf{W}_{j,i}^{GCN}Wj,iGCN均有值1,否则为0。(GCN输出的向量表示为hOh^{\mathcal{O}}hO)

​ 为了能够利用apsect信息来辅助opinion抽取,这里设计了一个辅助任务来集成aspect的边界信息和GCN的输出,称这部分为Target Guidance(TG)模块。具体来说,就是将apsect边界预测的隐向量hTh^{\mathcal{T}}hT和GCN输出的向量hOh^{\mathcal{O}}hO进行拼接,然后用于预测opinion的边界YTG={B,I,E,S}∪{O}\mathcal{Y}^{\mathcal{TG}}=\{B,I,E,S\}\cup\{O\}YTG={B,I,E,S}{O}
ztTG=p(ytOPT∣xt)=Softmax(WTG[htT;htO])z_t^{\mathcal{TG}}=\textbf{p}(y_t^{\mathcal{OPT}}|x_t)=\text{Softmax}(\textbf{W}^{\mathcal{TG}}[h_t^{\mathcal{T}};h_t^{\mathcal{O}}]) ztTG=p(ytOPTxt)=Softmax(WTG[htT;htO])
​ 除了将hOh^{\mathcal{O}}hOhTh^{\mathcal{T}}hT合并外,另一部分是将hOh^{\mathcal{O}}hO送入一个称为BiLSTMOPTBiLSTM^{\text{OPT}}BiLSTMOPT的双向LSMT中,然后输出一个上下文编码向量hOPTh^{OPT}hOPT(前面计算hUh^\mathcal{U}hU会用到),然后利用其进行opinion边界预测
ztOPT=p(ytOPT∣xt)=Softmax(WOPThtOPT)z_t^{\mathcal{OPT}}=\textbf{p}(y_t^{\mathcal{OPT}}|x_t)=\text{Softmax}(\textbf{W}^{\mathcal{OPT}}h_t^{\mathcal{OPT}}) ztOPT=p(ytOPTxt)=Softmax(WOPThtOPT)

3. 训练

​ 前面的过程会输出ztTz_t^{\mathcal{T}}ztTztTSz_t^{\mathcal{TS}}ztTSztTGz_t^{\mathcal{TG}}ztTGztOPTz_t^{\mathcal{OPT}}ztOPT,这里使用交叉熵计算损失函数
LI=−1T∑t=1TI(ytI,g)∘log(ztI)\mathcal{L}^{\mathcal{I}}=-\frac{1}{T}\sum_{t=1}^T\mathbb{I}(y_t^{\mathcal{I,g}})\circ log(z_t^{\mathcal{I}}) LI=T1t=1TI(ytI,g)log(ztI)
其中,I\mathcal{I}I是任务指示符和其可能的取值T,TS,TG,OPT\mathcal{T,TS,TG,OPT}T,TS,TG,OPTI(y)\mathbb{I}(y)I(y)表示one-hot编码,ytI,gy_t^{\mathcal{I,g}}ytI,g表示任务I\mathcal{I}I在时间步t处的标签。总的损失函数为所有损失函数之和
J(θ)=LT+LTS+LTG+LOPT\mathcal{J}(\theta)=\mathcal{L}^{\mathcal{T}}+\mathcal{L}^{\mathcal{TS}}+\mathcal{L}^{\mathcal{TG}}+\mathcal{L}^{\mathcal{OPT}} J(θ)=LT+LTS+LTG+LOPT
总结:LT\mathcal{L}^{\mathcal{T}}LT用于计算aspect的边界,LTS\mathcal{L}^{\mathcal{TS}}LTS用于结合opinion信息计算apsect边界和情感极性,LTG\mathcal{L}^{\mathcal{TG}}LTG用于结合apsect边界信息计算opinion的边界,LOPT\mathcal{L}^{\mathcal{OPT}}LOPT用于直接计算opinion的边界。

六、第二阶段

​ 经过第一阶段后,每个句子都会输出两个标签集合,分别是apsect和opinion,记为{T1,T2,…,Tn}\{T_1,T_2,\dots,T_n\}{T1,T2,,Tn}{O1,O2,…,Om}\{O_1,O_2,\dots,O_m\}{O1,O2,,Om},其中nnnmmm表示数量。枚举所有可能的aspect-opinion对来生成候选对池{(T1,O1),(T2,O2),…,(Tn,Om)}\{(T_1,O_1),(T_2,O_2),\dots,(T_n,O_m)\}{(T1,O1),(T2,O2),,(Tn,Om)},接下来就是判断每个aspect-opinion对是否有效。

1. 位置嵌入(position embedding)

​ 为了能够利用aspect和opinion的位置关系,这里会计算aspect中心词至opinion中心词之间单词的数量,用于表示两者的距离。为了便于训练,将aspect和opinion间的距离当做其位置索引,从而创建出position embedding(位置嵌入)。索引为0表示该单词既不是apsect,也不是opinion。可以观察下表中的(Waiter,friendly)(Waiter,friendly)(Waiter,friendly)(fugusashimi,friendly)(fugu sashimi,friendly)(fugusashimi,friendly)的位置索引。

2. 成对编码与分类

​ 这里将Glove词向量和position embedding进行拼接,然后输入至BiLSTM层来编码aspect和opinion上下文信息。将aspect和opinion位置输出的词向量进行各自平均,并将得到的2个向量进行拼接。最后将拼接后的向量送至softmax层进行分类。

​ 训练时使用标注好的aspect-opinion对,测试时直接使用模型在候选对池上进行预测。

【自然语言处理】【细粒度情感分析】细粒度情感分析:了解文本情感的What、How、Why相关推荐

  1. 循环神经网络实现文本情感分类之使用LSTM完成文本情感分类

    循环神经网络实现文本情感分类之使用LSTM完成文本情感分类 1. 使用LSTM完成文本情感分类 在前面,使用了word embedding去实现了toy级别的文本情感分类,那么现在在这个模型中添加上L ...

  2. 实体词典 情感词典_基于词典的文本情感分析(附代码)

    一.引言 目前中文文本情感分析主要分为三个类型,第一个是由情感词典和句法结构来做的.第二个是根据机器学习来做的(Bayes.SVM等).第三个是用深度学习的方法来做的(例如LSTM.CNN.LSTM+ ...

  3. python 文本分析库_Python有趣|中文文本情感分析

    前言 前文给大家说了python机器学习的路径,这光说不练假把式,这次,罗罗攀就带大家完成一个中文文本情感分析的机器学习项目,今天的流程如下: 数据情况和处理 数据情况 这里的数据为大众点评上的评论数 ...

  4. python英文文本情感分析_sentimentpy模块进行中文文本情感分类

    sentimentpy是我根据R语言的一个文本情感分析包sentiment进行开发的, 开发的初衷有: R的sentiment已经被弃坑, 没人维护 Python比R更擅长文本处理 sentiment ...

  5. python情感分析中文_Python有趣|中文文本情感分析

    前言 前文给大家说了python机器学习的路径,这光说不练假把式,这次,罗罗攀就带大家完成一个中文文本情感分析的机器学习项目,今天的流程如下: 数据情况和处理 数据情况 这里的数据为大众点评上的评论数 ...

  6. 基于python的情感分析案例-用python实现文本情感分析

    注:本文转载自知乎专栏 情感分析就是分析一句话说得是很主观还是客观描述,分析这句话表达的是积极的情绪还是消极的情绪. 原理 比如这么一句话:"这手机的画面极好,操作也比较流畅.不过拍照真的太 ...

  7. python情感词典_sentimentpy模块进行中文文本情感分类

    sentimentpy是我根据R语言的一个文本情感分析包sentiment进行开发的, 开发的初衷有: R的sentiment已经被弃坑, 没人维护 Python比R更擅长文本处理 sentiment ...

  8. 复盘:基于attention的多任务多模态情绪情感识别,基于BERT实现文本情感分类(pytorch实战)

    复盘:基于attention机制的多任务多模态情绪情感识别(pytorch实战),基于BERT实现文本情感分类 提示:系列被面试官问的问题,我自己当时不会,所以下来自己复盘一下,认真学习和总结,以应对 ...

  9. 深入解读华为云细粒度文本情感分析及其应用

    摘要:本篇文章主要介绍了情感分析的一些基本任务,包括文本.语音.图像还有生成.识别,着重讲述华为云在细粒度情感分析方面两个工作. 导读:先简单介绍一下文本情感分析的一些基本概念,然后介绍一下华为云在细 ...

  10. 中文文本情感分类及情感分析资源大全

    摘要:20世纪初以来,文本的情感分析在自然语言处理领域成为了研究的热点,吸引了众多学者越来越多的关注.对于中文文本的情感倾向性研究在这样一大环境下也得到了显著的发展.本文主要是基于机器学习方法的中文文 ...

最新文章

  1. python中 s是什么意思_python – “S”在同情中意味着什么
  2. WSDM 2022 | 基于元学习的多场景多任务商家建模
  3. 网易云音乐电脑版怎么下载电台节目 主播电台节目下载教程
  4. AndroidStudio快捷键——打开最近编辑文件列表视图——(一)
  5. tlplayer for ios V1.0
  6. (108)FPGA面试题-介绍STA静态时序分析及其作用
  7. 解释HTTP中Get和Post。它们有什么区别,哪个使用时更加安全?
  8. Turbo码相关学习
  9. 关于GPS坐标系和地图定位偏差
  10. B - Restore Modulo
  11. signal信号的基础知识
  12. Javascript的事件驱动
  13. 【Java】通讯录管理系统小项目
  14. xp系统为何无法登陆服务器,xp系统怎么登陆云服务器
  15. gdb+linux+查看变量,gdb查看变量值
  16. 来自一位程序员的经验之谈(三)
  17. 性格测试小软件有哪些,十个有趣的性格小测试 测试你是什么性格
  18. ES6(二) Destructuring-变量的解构赋值
  19. iOS ipv4和ipv6转换
  20. python读取excel股票历史数据_python获取涨停板历史数据

热门文章

  1. ajax瀑布流加载重叠,使用瀑布流插件masonry,图片未加载完就会出现重叠现象,怎么解决?...
  2. 国内人脸识别公司哪家强,人脸比对跑个分比较下!
  3. OneNet数据可视化View页面上的数据过滤器使用介绍
  4. SLAM十四讲 ch4 Sophus库安装避雷和使用
  5. 琴伤+园游会+迷迭香+美人鱼+上海一九四三+威廉古堡+最后的战役+她的睫毛+麦芽糖
  6. 大制作,1500多行python代码实现各大平台音乐搜索,下载,收听
  7. LangChain vs Semantic Kernel
  8. Android onMeasure、Measure、measureChild、measureChildren 一些简要说明
  9. 关于onMeasure(转载)
  10. 苹果手机来电归属地_工信部 : 暂未出台取消手机号码归属地政策!