热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

NLP判断语言情绪_网易严选nlp预训练语言模型的应用

随着2018年底bert的发布,预训练(pre-train)成为nlp领域最为热门的方向之一,大规模的无监督语料加上少量有标注的语料成为了nlp模型的标

92a8d8edeee8b24728040083a1e27e6f.png

b6ef33e710574cf125a4175fc6c56763.gif随着2018年底bert的发布,预训练(pre-train)成为nlp领域最为热门的方向之一,大规模的无监督语料加上少量有标注的语料成为了nlp模型的标配。本文将介绍几种常见的语言模型的基本原理和使用方式,以及语言模型在网易严选nlp业务上的实践,包括分类、文本匹配、序列标注、文本生成等。

前言

文本的表征经历了漫长的发展历程,从最简单经典的bow词袋模型、以LDA为代表的主题模型、以word2vec为代表的稠密向量模型、到现在以bert为代表的通用语言模型。词语是文本细粒度的表达,早期的预训练词向量虽简单易用,但无法解决一词多义的问题。近年来,基于大规模上下文语料,训练的通用语言模型,可以产出更细致的语义表征向量,相同的词在不同的语境中能抽取出不同的语义向量。

在通用常见的nlp任务中,数据标注是不能缺少的重要环节。数据的量级及质量会直接影响任务的效果。现实条件下,数据标注的成本往往很高,但好在我们拥有大量的无标注的语料。因此,基于无监督的海量语料训练一个通用的语言模型,然后针对不同的nlp任务,进行少量数据标注后,再对模型进行微调成为了发展的趋势。

模型结构

我们选取最具代表性的三个语言模型: ELMO[1]、GPT[2]、BERT[3] 进行对比,如下表所示。

b47775e0a09b11078e192d2a56bc4d51.png

语言模型BertGPTEMLO
模型结构
(见上图)
Transformer编码器Transformer解码器bi-lstm
目标任务(1) Masked LM
随机遮蔽的部分输入,进行预测
(2) Next sentence prediction
判断两个输入是否是上下文关系
标准语言模型
前k个输入预测第 k + 1个输入
双向语言模型
(1) 前k个输入预测第 k + 1个输入
(2)后k个输入预测倒数第 k + 1个输入
推荐使用方式微调微调特征集成
优缺点双向语言模型
Transformer抽取能力强
单向语言模型lstm特征抽取能力弱
训练速度慢

ELMO采用的lstm网络,而gpt和BERT采用的网络结构都是transformer。Transformer是谷歌17年的文章《attention is all you need》[4]中提出的一种自注意力机制,替代传统的RNN和CNN进行语义特征的抽取,在机器翻译上取得了优异的效果。

70c31d7f4f53c36a87e78ec4f7f5952e.png

Transformer 采用的是标准的seq2seq的模式(上左图所示),其中关键的特征抽取部分采用的是多抽头的自注意力机制(上右上图所示)。所谓的多抽头是指多个自注意力机制并行,最终拼接成输出的过程。注意力机制采用的是点乘注意力(上右下图所示)。

点乘注意力机制的主要有下面四个步骤:

  • query 到(key , value)的映射

  • 计算query与每个key之间的权重

  • softmax函数权重归一化

  • 权重和value进行加权求和

  • 自注意力就是Q,K,V均相同,均为输入

ede258789918e91297fc79f1875374fe.png

将RNN CNN Transformer三种常见的特征抽取方式的比较汇总于下表。

模型结构RNNCNNTransformer
时间复杂度O(N)
句子长度为N
O(N/k)
k为卷积核宽度
O(1)
非线性次数不一恒定恒定
参数数量较少较多较多
优劣表示能力不足,损失严重dependency范围有限
1 + a(k-1)a为卷积次数
一层实现输入序列上的 long-range dependencies

使用方式

应用模式

将预训练的语言模型运用到新的nlp任务上去时,有下面两种应用模式。

应用模式
特征集成
(Feature Ensemble)
要判断的输入句子,经过预训练的语言模型,获取对应单词的embedding,输入到下游任务的模型上去。
微调
(Fine-tuning)
仍然采用与预训练过程相同的网络结构,利用部分标注数据,直接在这个网络上进行模型训练,以针对性地修正预训练阶段获得的网络参数。

按理来说,各种语言模型均可以采用这两种使用方式,那么该如何选择,有研究[5][6][7]中给出了下面的结论:

  • ELMO来说,特征集成的应用方式,效果稳定地优于Fine-tuning;

  • 句子匹配类任务(输入多句), Bert采用Fine-tuning效果明显好于特征集成;

  • 其它类型的任务,在应用Bert的时候,Fine-tuning模式要稍好于特征集成模式,或者两者效果差不多。

特征表示

这类语言模型都是多层网络拼接,那么我们在使用时,也会有两种特征表示的方法。

  • 仅使用最高层的特征

  • 加权多层的特征

上面的研究给出了下面的结论:

  • ELMO在原文中给出了使用的建议,针对不同的任务,使用不同的权重向量加权每一层的特征,并乘上对应的缩放系数。cfbe38974a7ebf01e3c3dc7b4af70443.png

  • bert在句子匹配等多输入的NLP任务,直接使用最高层特征最简单,效果也最好。

  • 对于序列标注类任务,可能多层特征融合更适合应用场景。

实践

分类

分类是nlp中最常见的任务之一,常见的包括情感分析和文本分类,我们都有所涉及。

  • 情感分析 :如分析用户评论或者用户客服会话中的情绪,对于负面情绪严重的用户需要进行安抚。

  • 意图识别 :如在智能客服中,用户的问题进来之后,首先需要进行意图识别,判断用户的问题是在问“售后相关问题”“售前商品知识问题”还是单纯的“闲聊”或者其它的类型,然后分发到不同的模块进行解答和回复。

文本分类的算法模型常见的是融入attention机制的rnn或者cnn等各种网络结构。我们搭建严选智能客服意图识别分类体系的时候,采用ABL(attention bi-lstm)的模型结构。学习《attention is all you need》[4:1]中的编码方式,除了语义编码之外,加入position-embedding (位置编码),更好的进行句子表征。

基于bert fine-tuning的使用方式,在严选智能客服意图识别模块的业务流程分类模型上进行了测试。相同的测试集上效果评估如下表所示。

模型名称数据量测试集f1
ABL15W0.9743
BERT5K0.9612
BERT2W0.9714
BERT15W0.9745

可以看出:

  • 在文本分类任务上,bert带来的提升比较有限。原因可能在于分类任务不需要深层次的语义特征,传统方法捕捉到的语意特征已经能够较好地解决分类的问题,发挥不出预训练语言模型的强大之处。

  • 优势在于bert可以采用较少的样本就可以获得较好的泛化能力,减少人工标注的成本,但同时需要付出更多的计算资源。

文本表征

很多情况下,我们需要将句子转换到向量空间上去,获得一种表征方式。

在无监督计算两个文本的相似度或者是对文本进行聚类分析时,需要提取文本特征,除了传统特征之外,语意特征也是一个重要的组成部分。

在解答用户的faq问题时,一般都需要检索和排序两个过程。检索除了字面检索(例如BM25)之外,可以利用预先存好的标准faq的向量进行语意层面(例如ANN)的检索。

在谷歌官方给出的示例中,bert获取到的是每一个token(字)在倒数四层每一层输出的embedding。如果需要获得一个句向量,则需要对每一个token以及每一层的向量进行加权组合。

实际使用中,我们发现仅使用倒数第二层输出的token向量进行加权获得的句向量的匹配效果最好。原因可能在于,bert输出的最高层的语意向量是面向两个预训练的目标任务的,而倒数第二层的向量反而更加贴近句子本身的含义。在文本表征的任务中,不会对原有模型进行微调,只需要句子本身的含义表征即可。

文本匹配

文本匹配是非常经典的一类NLP任务,全称为Natural Language Inference,任务定义为:给定一个premise前提,推断hypothesis假设与前提的关系。其中关系分为三类:蕴涵关系(entailment)、矛盾关系 (contradiction) 、中立关系 (neutral)。在自动问答领域,NLI技术常被应用在句子相似度判别、问答语句相关性判别任务中。

从最简单的Siamese-LSTM,到InferNet、Decomposable Attention、ESIM,到BERT,文本匹配的算法也经历了一系列的网络结构变迁。BERT的出现,很好帮助我们在少量标注样本的情况下,达到一个好的匹配效果。

在严选的智能客服项目中,我们采取了多样化的问句匹配方案:(1)问题Q与答案A进行关联匹配(2)问题Q1与问题Q2进行相似匹配(3)问题Q与标准问题QS的关联匹配三类方式分别可以确保问句的相似召回效果、问答关联匹配效果,在match及rank阶段可以用策略灵活的加权判别。

在严选6W规模的标注数据量下,我们对比了Siamese-LSTM和BERT的匹配效果:

使用方式precisonrecallf1单条响应时间
Siamese-LSTM0.980.750.85<30ms
BERT0.960.970.97> 50ms

从上面的结果可以看出, bert效果显著优于孪生网络。原因可能在于&#xff1a;

  • bert在预训练阶段的目标任务之一就是预测两个句子之间是否是上下文的关系&#xff0c;可以学习到句间关系的知识。

  • 自注意力机制更加擅长捕捉深层的语意&#xff0c;可以获得句子A中单词和句子B中任意单词的细粒度的匹配结果&#xff0c;这在文本匹配任务中是至关重要的。

序列标注

序列标注是nlp领域中的四大任务之一&#xff0c;包括分词、词性标注、命名实体识别等nlp任务。我们主要关注命名实体识别(NER)任务&#xff0c;它的目的是识别出语料中的人名&#xff0c;地名等常见的命名实体。

在我们智能客服的场景下&#xff0c;主要关注的是用户问题中的商品实体&#xff0c;属性名实体以及属性值实体。以下图为例:8803a5962953595a96e6bf5bf5283cd9.png这个句子中用户关注的商品实体是“裤子”&#xff0c;关注的属性名是“颜色”&#xff0c;属性值是“红色“。NER的目的就是从用户的问题中解析出这三类实体&#xff0c;才能进行进一步的分析和解答。

NER算法常用的模型是双向的LSTM 加上条件随机场CRF&#xff0c;前者可以抓取对话文本的上下文特征&#xff0c;理解语境&#xff0c;充分提取上下文信息&#xff0c;后者则注重于当前对话文本的局部信息&#xff0c;有效挖掘当前对话文本的语义信息。

我们第一版的电商NER就是基于bi-lstm 加 crf构建的词粒度的模型&#xff0c;服务于线上的智能客服系统。之后我们比较了基于bert的特征集成和微调的模型:

特征集成 &#xff1a;将基于bert获取的embedding接入到传统的lstm加crf模型上去微调模型 &#xff1a;比较了高层特征和多层特征融合的效果。

使用方式precisonrecallf1单条响应时间
特征集成
bi-lstm &#43; crf
0,96860.88130.922> 100ms
微调
多层特征融合
0.93610.88010.9072<10ms
微调
高层特征
0.93560.83680.8824<10ms

在我们的数据集上&#xff0c;可以得到如下结果&#xff1a;

  • 特征集成的方式效果优于fine-tuning。原因可能在于在特征集成的时候&#xff0c;我们加入了额外的参数 (bi-lstm 和 crf 层) 。在[5:1]的研究中也进行了这种对比&#xff0c;对比的结果表明附加额外参数的效果会优于不附加的模型&#xff0c;如果fine-tuning的模型也融入crf层&#xff0c;两种使用方式的效果差不多。附加额外参数带来的效果增益特征集成的方式要明显大于fine-tuning的。

  • 多层特征融合的效果优于仅使用高层特征。原因对于序列标注的任务&#xff0c;我们不仅需要考虑句意的表征&#xff0c;还需要融合句子其它粒度的表征。

  • 在响应时间上, 特征集成 (附加额外参数) 的方式满足不了线上的需求&#xff0c;适用于离线服务&#xff0c;而微调的模型可以用于线上服务。

生成式任务

原生的Bert本身是无法用于生成式任务&#xff0c;这是由它的目标任务和模型结构决定的。后来发展出了一些可以用于生成式任务的预训练模型&#xff0c;比如MASS[8]。当然&#xff0c;仅仅使用训练好的语言模型&#xff0c;也可以生成文本&#xff0c;如上文介绍的gpt的升级版gpt[9]&#xff0c;基于大规模语料和庞大的模型&#xff0c;仅仅使用单向语言模型在生成文章方面取得不错的效果&#xff0c;吸引了业界的关注。在严选的场景下&#xff0c;除了闲聊机器人之外&#xff0c;还尝试用于文案生成。

闲聊机器人

智能客服中的闲聊模块&#xff0c;除了机器人的性格问答和检索模块之外&#xff0c;需要一个生成式的模型来承接用户的其他未配置的闲聊打趣问题。我们收集了外部的对话预料&#xff0c;构建了智能客服生成式的闲聊模块&#xff0c;效果如下图所示。fd48aa3c4afd2c64e66d4069c7da4d25.png

由于外部预料的层次不齐&#xff0c;偶尔会出现部分脏话等不可展示给用户的回答。

对联机器人

这个是我们在春节之间的一些尝试, 收集了网上70万的对联数据&#xff0c;构建了给上联对下联&#xff0c;以及对藏头联两种形式的对联机器人。直接对下联直接利用transformer即可构建&#xff0c;而藏头对联还需要一个语言模型基于首字生成上联的过程。

给出两个示例&#xff1a;

  • 对下联上联 &#xff1a;上海自来水来自海上下联 &#xff1a;中山落叶松叶落山中

  • 藏头对联:藏头 &#xff1a;网易上联 &#xff1a;网花读似客初归下联 &#xff1a;易水听惊人未还

夸夸机器人

这个是前段时间流行的一种玩法&#xff0c;自身夸人的语言功底匮乏可以让机器人来进行代劳。我们收集了豆瓣上的一些语料&#xff0c;基于检索和生成两种方式构建了一个夸夸机器人。

效果如下所示&#xff1a;Q1 &#xff1a;吃了好多零食 求夸A1 &#xff1a;哇哦哇哦这个是真的棒&#xff01;快去吃点零食安慰一下自己&#xff01;

Q1 : 代码出问题了 求夸A1 : 知道了自己的不足&#xff0c;好棒呀&#xff01;你会越来越强的~

文案生成

在严选的广告和搜索场景下&#xff0c;需要自动生成商品在指定卖点下的文案。除了传统的抽取式方法之外&#xff0c;我们也尝试利用预训练的语言模型进行文案生成。以一个“儿童衬衫”为例&#xff0c;展示一下利用预训练的语言模型生成的卖点文案。

儿童格纹长袖衬衫卖点-工艺卖点-风格
target先染后纺&#xff0c;色牢度高经典格纹&#xff0c;帅气立领
bert-generator针织工艺&#xff0c;精致细腻经典版型&#xff0c;时尚百搭
gpt2100%长绒棉&#xff0c;严格品控一家人满意学院风格&#xff0c;日系简约

其中&#xff0c;bert用于生成式任务时是将其作为seq2seq的encoder模型。

其他

除了上面提到的各种应用&#xff0c;语言模型还在nlp的其他领域有着应用场景&#xff0c;我们也在进行尝试。

  • 阅读理解 &#xff1a;不同于商品属性的知识是结构化且稳定的&#xff0c;活动规则的知识大都是非结构化的&#xff0c;且活动更新频繁。用户对于活动规则问题更加适合利用阅读理解的技术来进行回答。

  • 文本摘要 &#xff1a;用户跟客服的交互会有多轮&#xff0c;有价值的信息蕴含在其中部分句子中。我们可以借助摘要抽取的技术对每一个会话的session进行总结&#xff0c;进行规整和分析。

后记

Bert问世半年以来发表了很多相关的工作&#xff0c;包括bert在各个nlp领域的应用或者是各种升级的语言模型(gpt2[9:1]&#xff0c;MASS[8:1]&#xff0c;Xl-Net[10]等等)。大规模的无监督语料加上少量有标注的语料成为了nlp模型的标配。利用开源的语言模型可以解决普通的用户计算资源不够&#xff0c;语料不足的困境。

但是服务于线上任务,还需要考虑模型的QPS以及所需要耗费计算资源。也发展出了类似albert[11]的轻量级的预训练语言模型&#xff0c;提升模型推断的速度和减少依赖的计算资源。

预训练的语言模型在严选nlp的场景下得到了广泛的运用&#xff0c;同时我们借助于知识蒸馏等技术对这类复杂模型进行压缩&#xff0c;提升线上预测的速度&#xff0c;减少消耗的计算资源。并借助于多任务学习的方式&#xff0c;让多个任务的模型共享底层的预训练语言模型的信息&#xff0c;互相增强&#xff0c;进一步提升模型的泛化能力。

参考文献

[1] Peters M E, Neumann M, Iyyer M, et al. Deep contextualized word representations[J]. arXiv preprint arXiv:1802.05365, 2018.

[2] Radford A, Narasimhan K, Salimans T, et al. Improving language understanding by generative pre-training[J]. URL https://s3-us-west-2. amazonaws. com/openai-assets/research-covers/languageunsupervised/language understanding paper. pdf, 2018.

[3] Devlin J, Chang M W, Lee K, et al. Bert: Pre-training of deep bidirectional transformers for language understanding[J]. arXiv preprint arXiv:1810.04805, 2018.

[4] Vaswani A, Shazeer N, Parmar N, et al. Attention is all you need[C]//Advances in neural information processing systems. 2017: 5998-6008.

[5] Peters M, Ruder S, Smith N A. To Tune or Not to Tune? Adapting Pretrained Representations to Diverse Tasks[J]. arXiv preprint arXiv:1903.05987, 2019.

[6] Qiao Y, Xiong C, Liu Z, et al. Understanding the Behaviors of BERT in Ranking[J]. arXiv preprint arXiv:1904.07531, 2019.

[7] Kaneko M, Komachi M. Multi-Head Multi-Layer Attention to Deep Language Representations for Grammatical Error Detection[J]. arXiv preprint arXiv:1904.07334, 2019.

[8] Song K, Tan X, Qin T, et al. Mass: Masked sequence to sequence pre-training for language generation[J]. arXiv preprint arXiv:1905.02450, 2019.

[9] Radford A, Wu J, Child R, et al. Language models are unsupervised multitask learners[J]. OpenAI Blog, 2019, 1(8).

[10] Yang Z, Dai Z, Yang Y, et al. XLNet: Generalized Autoregressive Pretraining for Language Understanding[J]. arXiv preprint arXiv:1906.08237, 2019.

[11] Lan Z, Chen M, Goodman S, et al. ALBERT: A lite BERT for self-supervised learning of language representations[J]. arXiv preprint arXiv:1909.11942, 2019.

作者简介

纪志伟&#xff0c;2018年硕士毕业于浙江大学&#xff0c;后加入网易严选算法部。从零到有参与了网易严选智能客服的算法构建工作&#xff0c;并为考拉智能客服提供算法能力支持。致力于将自然语言处理领域的新技术与业务相结合&#xff0c;赋能于严选智能客服、人工客服工作台、客服质检等各个场景。

本文由作者授权严选技术团队发布

c7597d8140677923ed879555b7fdeb12.png

4d8b0b6242ffe7098f28a50ad09c37b8.png



推荐阅读
  • 3年半巨亏242亿!商汤高估了深度学习,下错了棋?
    转自:新智元三年半研发开支近70亿,累计亏损242亿。AI这门生意好像越来越不好做了。近日,商汤科技已向港交所递交IPO申请。招股书显示& ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • Explain如何助力SQL语句的优化及其分析方法
    本文介绍了Explain如何助力SQL语句的优化以及分析方法。Explain是一个数据库SQL语句的模拟器,通过对SQL语句的模拟返回一个性能分析表,从而帮助工程师了解程序运行缓慢的原因。文章还介绍了Explain运行方法以及如何分析Explain表格中各个字段的含义。MySQL 5.5开始支持Explain功能,但仅限于select语句,而MySQL 5.7逐渐支持对update、delete和insert语句的模拟和分析。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • 本文介绍了贝叶斯垃圾邮件分类的机器学习代码,代码来源于https://www.cnblogs.com/huangyc/p/10327209.html,并对代码进行了简介。朴素贝叶斯分类器训练函数包括求p(Ci)和基于词汇表的p(w|Ci)。 ... [详细]
  • PRML读书会第十四章 Combining Models(committees,Boosting,AdaBoost,决策树,条件混合模型)...
    主讲人网神(新浪微博:豆角茄子麻酱凉面)网神(66707180)18:57:18大家好,今天我们讲一下第14章combiningmodel ... [详细]
  • 生成对抗式网络GAN及其衍生CGAN、DCGAN、WGAN、LSGAN、BEGAN介绍
    一、GAN原理介绍学习GAN的第一篇论文当然由是IanGoodfellow于2014年发表的GenerativeAdversarialNetworks(论文下载链接arxiv:[h ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • EPPlus绘制刻度线的方法及示例代码
    本文介绍了使用EPPlus绘制刻度线的方法,并提供了示例代码。通过ExcelPackage类和List对象,可以实现在Excel中绘制刻度线的功能。具体的方法和示例代码在文章中进行了详细的介绍和演示。 ... [详细]
author-avatar
婉婷雅铃43
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有