精华内容
下载资源
问答
  • Python数据预处理(一)一抽取多源数据文本信息
    2020-11-24 09:00:00

    操作文件和目录

    os.name  判断操作系统类型如果是posix,说明系统是Linux、Unix或Mac OS X,如果是nt,就是Windows系统

    os.uname()  获取详细的系统消息(Windows上不提供)

    os.path.abspath(r"相对路径")  相对路径转绝对路径

    os.path.abspath('.')  查看当前目录的绝对路径

    os.path.split("绝对路径") 拆分文件路径、文件名

    os.path.join(A, B)  合并A、B两个路径

    os.path.exists("绝对路径")  检查该绝对路径是否存在

    os.makedirs("绝对路径")、os.mkdir("绝对路径")  创建目录

    os.rmdir("绝对路径")  删掉一个目录

    os.path.isdir("绝对路径") 判断是否是文件夹/目录

    os.path.isfile("绝对路径") 判断是否是文件

    fnmatch.fnmatch("原文","要匹配的内容")  匹配文件

    client.Dispatch('Word.Application').Documents.Open("文件名").SaveAs("新路径",4)  打开提取文件内容并保存

    client.Dispatch('Word.Application').Documents.Open("文件名").Close()  关闭文件

    更多相关内容
  • 对于各种任务,例如文本分类、无监督主题建模和问题回答等,不断的在刷新业界最佳。其中,最伟大的发现之一是在神经网络结构中采用了注意力机制。这种技术是所有称为transformers的网络的基础。他们应用注意力机制来...

    作者:Marco Cerliani

    编译:ronghuaiyang

    正文共:2062 字 10 图

    预计阅读时间:6 分钟

    导读

    使用不同的方式来使用BERT模型。

    在NLP中不断的研究产生了各种各样的预训练模型。对于各种任务,例如文本分类、无监督主题建模和问题回答等,不断的在刷新业界最佳。其中,最伟大的发现之一是在神经网络结构中采用了注意力机制。这种技术是所有称为transformers的网络的基础。他们应用注意力机制来提取关于给定单词上下文的信息,然后将其编码到一个学习到的向量中。

    作为数据科学家,我们可以调用很多transformers架构,并使用它们对我们的任务进行预测或微调。在这篇文章中,我们喜欢读经典的BERT,但是同样的推理也适用于其他所有的transformer结构。我们使用了siamese结构,这是一个双路BERT,用于多文本输入的分类。

    数据

    我们从Kaggle上收集数据集。新闻类别数据集:https://www.kaggle.com/rmisra/news-category-dataset包含从HuffPost上获得的2012年至2018年的约20万条新闻标题。我们需要根据两种不同的文本来源对新闻文章进行分类:标题和简介。我们总共有40多种不同类型的新闻。为了简单起见,考虑到工作流的计算时间,我们只使用了8个类的一个子组。

    我们不应用任何预处理和数据清洗,我们让BERT表演所有的魔法。我们的工作框架是TensorflowHuggingface的transformer库。更详细地说,我们使用了原始的Bert模型transformer,它的输出就是原始的隐藏状态,没有任何特定的头。它可以像Tensorflow模型的子类一样访问,并且可以很容易地在我们的网络架构中进行调优。

    单个BERT

    作为第一个竞争者,我们引入了单个BERT的结构。它只接收一个文本输入,这是两个文本源拼接的结果。这是正常操作:任何模型都可以接收拼接起来的特征作为输入。对于transformers,这个过程将输入与特殊tokens结合起来。

    BERT期望输入数据以特定的格式:有特殊的tokens来标记句子/源文本的开头([CLS])和结尾([SEP])。与此同时,tokenization包括将输入文本拆分为词汇表中可用的tokens列表。对词汇表外的单词进行word-piece的处理,一个单词被逐步分解为子单词,这些子单词是词汇表的一部分。该过程可以通过预先训练好的Huggingface的Tokenizer轻松实现,我们只需要注意填充。

    我们最后从源文本的输入中得到了三个矩阵(标记、掩码、序列id)。它们是我们的transformers的输入。在单个BERT的情况下,我们只有一个矩阵的元组。这是因为我们同时将两个文本序列传递给我们的tokenizer,这两个文本序列被自动拼接起来(使用[SEP] token)。

    我们的模型结构非常简单:transformer直接与我们在上面构建的矩阵相连接。最后,通过平均池操作减少了transformer的最终隐藏状态。概率分数是由最终的dense层计算出来的。

    我们的简单BERT对测试数据的准确率达到83%。性能报告在下面的混淆矩阵中。

    双路BERT

    我们的第二个结构可以定义为双路BERT,因为它使用了两个不同的transformers。他们有相同的组成,但训练用不同的输入。第一个接收新闻标题,另一个接收简介。输入被编码为两个矩阵元组(token, mask, sequence ids),每个输入一个。对于两个数据源,我们的transformers的最终隐藏状态都使用平均池来聚合。它们被拼接起来,并通过一个全连接层传递。

    通过这些设置,我们可以获得测试数据84%的准确度。

    SIAMESE BERT

    我们最后的模型是一种Siamese的结构。可以这样定义它,因为两个不同的数据源是在同一个可训练的transformer结构中同时传递的。输入矩阵与Siamese BERT的情况相同。对于这两个数据源,transformer的最终隐藏状态是通过平均操作聚合的。产生的连接在一个全连接层中传递,该层将它们组合在一起并产生概率。

    我们的siamese结构在我们的测试数据上达到82%的准确度。

    总结

    在这篇文章中,我们应用BERT结构来执行一个多类分类任务。我们实验的附加价值是使用transformers 以不同的方式处理多个输入源。我们从只有一个源中的所有输入的经典拼接结构开始,并以为模型提供分开的文本输入作为结束。双路BERT和siamese BERT都能够实现良好的性能。由于这个原因,它们可以被认为是经典的单变压器结构的良好替代品。

    —END—

    英文原文:https://towardsdatascience.com/siamese-and-dual-bert-for-multi-text-classification-c6552d435533

    添加个人微信,备注:昵称-学校(公司)-方向,即可获得

    1. 快速学习深度学习五件套资料

    2. 进入高手如云DL&NLP交流群

    记得备注呦

    展开全文
  • 在线新闻的多源情感标记
  • 随机森林文本分类

    2022-04-09 09:53:35
    二、随机森林是什么三、 数据预处理3.1 先来看一下我们的文本数据3.2 预处理3.3 统计评论情感值积极与消极的占比二、使用步骤参数介绍(4个)属性1.引入库2.参数调参方法总结 前言 提示:这里可以添加本文要记录的...

    随机森林原理及代码实现

    机器学习系列

    第一章 随机森林原理及代码实现



    前言

    例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


    一、集成算法是什么?

    集成学习是通过在数据上构建多个模型,集成所有模型的建模结果,目的是获取比单个模型更好得到回归或分类现象。多个模型集成成为的模型叫做集成评估器(ensemble estimator),组成集成评估器的每个模型都叫做基评估器
    (base estimator)。在这里,对于随机森林来说,它的基评估器就是决策树。
    常见的集成算法有袋装法Bagging(举例随机森林)、提升法Boosting(举例梯度提升树 GBDT、Adaboost)和stacking。
    在这里插入图片描述
    袋装法是构建多个相互独立的评估器,然后对其预测的结果求平均值或多数表决原则。
    可是,如果每个树模型都比较弱,整体平均完也还是会很弱,那么这时候提升法Boosting就登场了。
    提升法是
    每个基评估器都是相关的,是按照顺序一一构建的。核心思想就是在一次次的建模过程当中,逐渐将模型方向调整到对难以评估的样本进行强烈预测。简单来说就是,在先采样,即样本1,然后构建一个模型,即模型1,对于样本中预测错误的样本,在下一轮采样中会增加它们的权重,一直重复上述操作。

    二、随机森林是什么

    三、 数据预处理

    3.1 先来看一下我们的文本数据

    在这里插入图片描述

    数据解读:
    情感标注列:1表示文本内容为积极的,0表示文本内容为消极的
    content:文本

    3.2 预处理

    将数据分成2列,一列评论,一列情感值,对文本列进行分词、去停用词
    数据分列:

    import random
    import numpy as np
    import csv
    import jieba 
    
    file_path = '224.csv'
    jieba.load_userdict("dict/否定词.txt")   #用户词典,帮助分词更成功
    jieba.load_userdict("dict/负面评价词语(中文).txt")
    jieba.load_userdict("dict/负面情感词语(中文).txt")
    jieba.load_userdict("dict/正面评价词语(中文).txt")
    jieba.load_userdict("dict/正面情感词语(中文).txt")
                        
    #加载文件
    with open(file_path, 'r', encoding='UTF-8') as f:
        reader = csv.reader(f)
        rows = [row for row in reader]
    
    # 将读取出来的语料转为list
    review_data = np.array(rows).tolist()
    
    # 打乱语料的顺序
    random.shuffle(review_data)
    
    review_list = []
    sentiment_list = []
    # 第一列为差评/好评, 第二列为评论
    for words in review_data:
        review_list.append(words[1])
        sentiment_list.append(words[0])
    

    数据分词、去停用词:
    在这里,由于此文本为知乎舆论文本,我获取不到知乎评论数据的分词词典,就用了现在主流的一些词典。
    词典的获取链接:词典链接
    提取码:pony

    import re
    import jieba
    
    
    stopword_path = 'D:/pythonzx/douban_sentiment_analysis-master/data/stopwords.txt'
    
    #加载停用词表
    def load_stopwords(file_path):
        stop_words = []
        with open(file_path, encoding='UTF-8') as words:
            stop_words.extend([i.strip() for i in words.readlines()])
        return stop_words
    
    #分词、去停用词
    def review_to_text(review):
        stop_words = load_stopwords(stopword_path)
        # 去除英文
        review = re.sub("[^\u4e00-\u9fa5^a-z^A-Z]", '', review)
        review = jieba.cut(review)
        # 去掉停用词
        if stop_words:
            all_stop_words = set(stop_words)
            words = [w for w in review if w not in all_stop_words]
    
        return words
    
    
    # 用于训练的评论,文字
    review_train = [' '.join(review_to_text(review)) for review in review_list]
    # 对于训练评论对应的好评/差评,01
    sentiment_train = sentiment_list
    

    查看预处理结果:
    在这里插入图片描述

    3.3 统计评论情感值积极与消极的占比

    #训练的样本数中,积极评论占xx条
    sum=0
    for i in range(len(sentiment_train)):
        if sentiment_train[i] == "1":
            sum = sum + 1
    print(sum)
    #训练的样本数中,消极极评论占xx条
    sum=0
    for i in range(len(sentiment_train)):
        if sentiment_train[i] == "0":
            sum = sum + 1
    print(sum)
    

    为了训练模型构建的准确性,建议最好的积极消极各占一半

    二、使用步骤

    参数介绍(4个)

    random_state:目的让模型稳定下来。
    用来设置分枝中的随机模式的参数,默认None,在高维度时随机性会表现更明显,低维度的数据
    (比如鸢尾花数据集),随机性几乎不会显现。输入任意整数,会一直长出同一棵树,让模型稳定下来。
    n_estimators:控制森林中数目的数量。
    这是森林中树木的数量,即基基评估器的数量。这个参数对随机森林模型的精确性影响是单调的,n_estimators
    越大,模型的效果往往越好。

    为了让每棵树(基分类器)尽量不一样,除了random_state,还有bootstarp。
    bootstrap:默认True,代表采用这种有放回的随机抽样技术
    在一个含有n个样本的原始训练集,我们进行随机采样,每次采样一个样本,并在抽取下一个样本的之前将这个样本放回原始训练集中,这样采集n次,最终得到一个和原始训练集一样大的,n个样本组成的自助集。
    由于是随机采样,这样每次的自助集个原始数据集不同,它用来训练我们的基分类器。
    oob_score:默认True,是否用袋外数据来测试我们的模型。当n和n_estimators足够大的时候,袋外数据约有37%的数据会被浪费掉。
    37%怎么来的:
    在一个自助集里一个样本会被抽到的概率:
    在这里插入图片描述
    概率收敛于1-(1/e),约等于0.632。
    那么在一个自助集里一个样本不会被抽到的概率为:
    1-0.632=0.368,约等于37%。

    属性

    estimators_:查看森林中数的情况
    在这里插入图片描述
    oob_score_:计算袋外数据的预测准确率
    在这里插入图片描述

    1.模型构建

    代码如下(示例):

    # 划分训练集、测试集
    from sklearn.model_selection import train_test_split
    Xtrain, Xtest, Ytrain, Ytest = train_test_split(xtrain_vec,sentiment_train,test_size=0.3)
    # 模型训练
    from sklearn.tree import DecisionTreeClassifier
    from sklearn.ensemble import RandomForestClassifier
    clf = DecisionTreeClassifier(random_state=1)
    rfc = RandomForestClassifier(random_state=1)
    clf = clf.fit(Xtrain,Ytrain)
    rfc = rfc.fit(Xtrain,Ytrain)
    score_c = clf.score(Xtest,Ytest)
    score_r = rfc.score(Xtest,Ytest)
    print("Single Tree:{}".format(score_c),"Random Forest:{}".format(score_r))
    

    2.参数调参方法

    1、学习率曲线

    # 这是森林中树木的数量,即基基评估器的数量。这个参数对随机森林模型的精确性影响是单调的
    # n_estimators越大,模型的效果往往越好
    # n_estimators的学习曲线
    superpa = []
    for i in range(200):
        rfc = RandomForestClassifier(n_estimators=i+1,n_jobs=-1,random_state=1)
        rfc_s = cross_val_score(rfc,xtrain_vec,sentiment_train,cv=10).mean()
        superpa.append(rfc_s)
    # 打印分数最高时的分数和n_estimators的值
    print(max(superpa),superpa.index(max(superpa))+1)
    plt.figure(figsize=[20,5])
    plt.plot(range(1,201),superpa)
    plt.show()
    

    在这里插入图片描述
    可以看到此时n_estimators为138时,分数最高。
    将上面n_estimators的最佳值放到下面的模型训练中去,寻找max_depth的最佳。

    #  max_depth的学习曲线
    superpa = []
    for i in range(20):
        rfc = RandomForestClassifier(max_depth=i+1,n_jobs=-1,random_state=1,n_estimators=138)
        rfc_s = cross_val_score(rfc,xtrain_vec,sentiment_train,cv=10).mean()
        superpa.append(rfc_s)
    # 打印分数最高时的分数和max_depth的值
    print(max(superpa),superpa.index(max(superpa))+1)
    plt.figure(figsize=[20,5])
    plt.plot(range(1,21),superpa)
    plt.show()
    

    2、网格调优

    from sklearn.ensemble import RandomForestClassifier
    from sklearn.model_selection import cross_val_score #K折交叉验证
    from sklearn.model_selection import GridSearchCV  # 网格调参
    from sklearn.model_selection import RandomizedSearchCV
    #分类问题,先建立一个分类器
    clf = RandomForestClassifier(n_estimators=20)
    
    #给定参数搜索范围
    param_test={'max_depth':[i for i in range(1, 25, 2)],
               'n_estimators':[i for i in range(1, 150, 5)],
               "min_samples_split": [i for i in range(1, 10, 2)]}
    
    #RandomSearch+CV选取超参数
    random_search = RandomizedSearchCV(clf,param_distributions =param_test,n_iter=20,cv=5)
    
    random_search.fit(xtrain_vec,sentiment_train)
    
    print("随机搜索最优得分:",random_search.best_score_)
    print("随机搜索最优参数组合:\n",random_search.best_params_)
    

    总结

    本篇在这里介绍了对评论情感分类采用了随机森林的方法,感觉预测效果一般,仅有60%左右的正确率,排除是文本标签是人工标注所导致的误差,在后面我们采用别的机器学习模型尝试一下,像是朴素贝叶斯等。

    展开全文
  • 是用于分析和机器学习用例的多源顺序数据的汇编器。 它旨在读取CSV文件中存储的数据。 该工具可以将多个CSV文件合并为一个JSON记录。 从JSON文件中,数据可以组合成单独的数据序列,RNN(递归神经网络)序列类型模型...
  • Text Template Parser 是一款简单实用的集数据检索、数据提取和数据转换的多数据源综合性文本数据提取软件,拥有友好的用户界面,可以帮助用户从包括文本文件、网页、电子邮件、excel、pdf、Web表单在内的几乎任意...
  • 公众号 系统之神与我同在 近年来,基于深度学习的表示学习方法在语音识别、图像分析和自然语言处理领域获得了广泛的关注。...融合文本和知识图谱的知识学习表示方法: 如果仅仅利用知识图谱的三元结构信.

    在这里插入图片描述

    公众号 系统之神与我同在

    近年来,基于深度学习的表示学习方法在语音识别、图像分析和自然语言处理领域获得了广泛的关注。表示学习旨在将研究对象的语义信息表示为稠密低维实值向量,在该低维向量空间中,两个对象的距离越近则说明其语义相似度越高。而知识表示学习,顾名思义,是面向知识库中的实体和关系进行表示学习。该方向最近取得了重要进展,可以在低维空间中高效计算实体和关系的语义联系,有效解决数据稀疏问题,使知识获取、融合和推理性能得到显著提升。
    在这里插入图片描述
    融合文本和知识图谱的知识学习表示方法:

    如果仅仅利用知识图谱的三元结构信息进行表示学习,数据稀疏问题严重,尚有大量与知识有关的其他信息没有得到有效利用。可以从两个方向解决这个问题:1.利用知识库中的其他信息,如实体和关系的描述信息等。2.利用知识库外的海量信息,如互联网文本等包含大量与知识库实体和关系有关的信息。

    融入文本描述的优势:

    1.可以发掘实体间的语义相关性,精确的语义表述能够提升三元组的可区分性。
    2.可以解决zero-shot问题。

    实体的描述文本:

    将所有三元组的“属性-属性值”或“关系-实体提及”都拼成一个字符串,当作该实体的文本描述。由于 type 字段,义项描述和摘要字段的信息更重要,描述文本中都按照 type、义项描述、摘要和其他三元组的顺序进行拼接。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    融合文本和知识图谱的知识表示学习方法可以做到:

    1.得到实体向量
    2.得到词向量
    3.词向量和实体向量之间可以计算相似度
    4.实体向量和实体向量之前可以计算相似度

    在这里插入图片描述

    知识表示学习的应用:
    实体链接中的应用:

    实体链接,就是把文本中的实体指称链接到知识图谱对应的实体上的任务。

    Knowledge Graph(知识图谱):一种语义网络,旨在描述客观世界的概念实体及其之间的关系。

    Mention(提及、实体指称):自然文本中表达实体的语言片段。

    Entity(实体):实体是知识库的基本单元,也是文本中承载信息的重要语言单位,由多个三元组组成。
    在这里插入图片描述
    难点:

    Mention Variations:同一entity有不同的mention。(<李白>:青莲居士、李太白)

    **Entity Ambiguity:**同一mention对应不同的entity。(“李白”:王者荣耀中李白的技能;李白和杜甫并称为什么?)
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/7a6d7bc6bfcf42acbab366e247dba523.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATmVjdGhlcg==,size_20,color_FFFFFF,t_70,g_se,x_16
    在这里插入图片描述

    实体推荐中的应用:

    实体推荐,就是根据给定的实体,推荐一系列相关实体。
    在这里插入图片描述
    实体推荐冷启动问题:如何寻找实体的相关实体?

    **方案:**通过百科页面、关系三元组、经过实体链接处理的新闻中的共现实体对,经过类别过滤,作为正样本进行训练。
    在这里插入图片描述
    在这里插入图片描述
    知识补全中的应用:

    知识图谱补全(Knowledge Graph Completion,KGC)目前主要被抽象成一个预测问题,即预测出三元组中缺失的部分。
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 考虑到在金融领域,事件的发生经常影响在线舆论空间和真实交易空间,因此本文提出了一种基于股票交易时间序列数据和在线舆论文本多源异构信息检测方法。数据以检测股市中的热点事件。 该方法采用离群检测算法,...
  • 基于多源知识的实体链接和语义标注系统研究与实现,刘特,马跃,在大数据时代快速准确地获取有用的数据信息成为重要的问题。实体链接主要目的就是从文本中找出重要的实体,并链接到知识库中提供
  • 点击上方蓝字关注我们制造业生产过程中多源异构数据处理方法综述陈世超1,2,崔春雨1,张华3,马戈4,朱凤华1,商秀芹1,熊刚,11中国科学院自动化研究所复杂系统管理与控制国...
  • Bayes是什么意思

    2020-12-21 10:02:41
    Bayes是什么意思 12. The performance of the method is evaluated by fusing Landsat TM images and SAR image for land use classification. 提出了顾及各数据源成像模型、上下文关系模型和可靠性的基于Bayes融合...
  • 目前我们使用的是主从+分...在mysql 5.6以及之前的版本中,没有原生的解决方法,除非使用mariadb分支,在mysql 5.7之后支持多源复制,除了使用原生的多源复制之外,还有一个选择,就是使用案例开源的otter/canal。如...
  • 我们以常见的多源分片为报表为用例,来对比评测这些产品的处理能力(由于时间和知识限制,个别很偏的功能点可能会有遗漏)。 内容比较长,如果不想看细节,可以直接跳到最后看结论。 用例说明 报表式样 数据...
  • 多源迁移学习相关研究回顾

    千次阅读 2020-09-04 18:18:49
    论文标题:Multi-Source Domain Adaptation for Text Classification via DistanceNet-Bandits 论文来源:AAAI 2020 论文链接:https://arxiv.org/abs/2001.04362 这是一篇多源迁移学习运用在 NLP 背景下的文本分类...
  • 多源数据汇聚方案

    千次阅读 2019-08-23 11:31:42
    1 软件提供广泛的数据接口,支持对各类主流数据库(Oracle、DB2、SQL Server、MySQL、PostgreSQL、Informix等)、外部文件(文本、XML、Excel)进行读写访问。 2 软件内置丰富的数据转换功能,如类型转换、字段...
  • 本文主要向大家介绍了MySQL数据库 5.7多源复制(用于生产库多主库合并到一个查询从库),通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助。目前我们使用的是主从+分库分表的系统架构,主库有N个分库,从...
  • 关于多源统一数据接入的思考

    千次阅读 2019-12-06 14:10:58
    统一数据接入 数据接入就是对于不同的数据来源、不同的合作伙伴,完成数据采集、数据传输、数据处理、数据缓存到...1.文本文件----(txt,csv)----utf-8 (踩过的坑-gbk编码和数据中换行符触发spark2.2 加载文件的bu...
  • :page_facing_up: 支持不同的文本源:文件系统文件/目录, 字符串和多源(添加!) :hammer_and_wrench: 支持文本处理器: MarkdownRemover (添加您的!) :repeat_button: 支持拼写错误的处理程序: ...
  • 文章目录聚类方法多源数据聚类算法多角度聚类多任务聚类多任务多视角聚类迁移聚类多模聚类 聚类方法 多源数据聚类算法 多角度聚类 很多时候个数据集的属性集可以划分成多个子集,每个子集可以较完整地反映数据...
  • 郑宇:多源数据融合与时空数据挖掘(转载)

    万次阅读 多人点赞 2018-09-11 16:12:39
    主动式群体感知就是,任务是什么很明确,什么时间、什么地点、干什么事情、共享用什么数据,这个数据拿来干什么用都很清楚,甚至还有激励机制,你可以选择什么时候加入或不加入。这是目前城市数据来源的四种方式。 ...
  • 文本匹配算法综述

    千次阅读 2021-06-24 11:22:04
    文本匹配任务在自然语言处理中是非常重要的基础任务之一,有很多应用场景;如信息检索、问答系统、文本数据去重等。 文本匹配算法按有无训练集可分为有监督算法和无监督算法;按算法的发展阶段可分为传统算法和深度...
  • 这是一篇用GAN做文本生成图像(Text to Image、T2I)的论文,文章在2016年由Reed等人发布,被ICML会议录取。可以说是用GAN做文本生成图像的开山之作。 本篇文章是精读这篇论文的报告,包含一些个人理解、知识拓展和...
  • 多源信息融合与多视角学习

    千次阅读 2019-04-18 16:54:22
    2多源异构数据:多种数据形式不同 3综述 4相关博主 1、传统降维与张量学习 1传统PCA PCA的思想是将n维特征映射到k维上(k<n),这k维是全新的正交特征。这k维特征称为主元,是重新构造出来的k...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,517
精华内容 1,406
关键字:

多源文本什么意思