Python如何进行文本分类?Scikit-learn实践

文本分类是让计算机理解并自动给文字打标签的过程,scikit-learn提供了完整的解决方案。1. 数据预处理:清理原始数据,包括分词、大小写转换、移除标点符号和停用词、词形还原等步骤;2. 特征提取:使用countvectorizer或tfidfvectorizer将文本转化为数值向量,前者统计词频,后者引入逆文档频率突出关键词;3. 模型训练与选择:常用算法包括朴素贝叶斯、svm、逻辑回归和集成方法,通过pipeline串联流程提升效率;4. 模型评估:关注精确率、召回率、f1-score和混淆矩阵,避免仅依赖准确率;5. 处理不平衡数据:优化策略包括调整评估指标、采用过采样(如smote)或欠采样、设置类别权重、使用代价敏感学习和集成方法,结合多种策略提升模型性能。

Python如何进行文本分类?Scikit-learn实践

文本分类,简单来说,就是让计算机理解并自动给一段文字打上标签。在Python生态里,Scikit-learn是一个非常趁手的工具,它能帮助我们把文本这种非结构化数据,转化成机器能理解的数字形式,然后用各种算法进行归类。这背后其实就是一套将文字特征化、再进行模式识别的过程。

Python如何进行文本分类?Scikit-learn实践

解决方案

进行文本分类,尤其是在Scikit-learn的框架下,通常会经历几个核心步骤:数据预处理、特征提取、模型训练与评估。

Python如何进行文本分类?Scikit-learn实践

1. 数据预处理:清理与规范原始文本数据往往比较“脏”,充斥着标点符号、数字、停用词(比如“的”、“是”、“了”这些对分类意义不大的词)甚至错别字。所以,第一步通常是进行一系列清洗:

分词 (Tokenization): 把句子拆分成独立的词语或短语。中文可能需要jieba等库。大小写转换 (Lowercasing): 统一大小写,避免“Apple”和“apple”被视为不同的词。移除标点符号和数字: 根据任务需求决定是否保留。移除停用词 (Stop Word Removal): 剔除那些常见但信息量低的词。词形还原/词干提取 (Lemmatization/Stemming): 将词语还原到其基本形式,比如“running”、“ran”都还原成“run”,减少词汇量,提升泛化能力。

2. 特征提取:文本到向量的转换这是文本分类的核心挑战之一,因为机器学习模型只能处理数值。Scikit-learn提供了强大的工具来完成这个转化:

Python如何进行文本分类?Scikit-learn实践词袋模型 (Bag-of-Words, BoW) – CountVectorizer: 这是一种最直观的方法,它统计每个词在文档中出现的频率。想象一下,每个文档都变成了一个长长的向量,向量的每个维度代表一个词,值就是该词出现的次数。优点是简单易懂,实现方便。TF-IDF (Term Frequency-Inverse Document Frequency) – TfidfVectorizer: TF-IDF在词频的基础上,引入了“逆文档频率”的概念。它不仅考虑一个词在当前文档中出现的频率(TF),还考虑这个词在整个语料库中出现的稀有程度(IDF)。一个词在某个文档中出现频繁,但在其他文档中很少出现,那么这个词的TF-IDF值就会高,被认为是该文档的“关键词”。这能有效降低“的”、“是”这类高频但无意义词的权重。我个人在实践中,发现TF-IDF在很多通用文本分类任务上效果优于简单的词袋模型。

3. 模型选择与训练:让机器学会分类特征向量准备好后,就可以选择合适的机器学习算法进行训练了。Scikit-learn提供了多种分类器:

朴素贝叶斯 (Naive Bayes): 比如 MultinomialNBBernoulliNB。它们在文本分类领域表现出色,计算速度快,尤其适合处理高维稀疏数据。支持向量机 (Support Vector Machine, SVM): SVCLinearSVC。SVM在高维空间中表现优秀,通常能找到一个最优的超平面来分隔不同类别的数据。逻辑回归 (Logistic Regression): LogisticRegression。虽然名字里有“回归”,但它是一种非常有效的分类算法,尤其适合二分类问题,也能扩展到多分类。集成学习 (Ensemble Methods): 如随机森林 (RandomForestClassifier) 或梯度提升树 (GradientBoostingClassifier)。这些模型通过结合多个弱学习器来提升整体性能。

训练过程通常涉及将数据集划分为训练集和测试集(train_test_split),用训练集来“教导”模型,再用测试集来评估模型的泛化能力。

立即学习“Python免费学习笔记(深入)”;

4. 模型评估:判断好坏仅仅看准确率(Accuracy)往往不够,尤其是在类别不平衡的数据集中。我们还需要关注:

精确率 (Precision): 模型预测为正例的样本中,有多少是真的正例。召回率 (Recall): 实际为正例的样本中,有多少被模型正确地预测为正例。F1-Score: 精确率和召回率的调和平均值,综合衡量模型的性能。混淆矩阵 (Confusion Matrix): 直观展示模型在每个类别上的分类情况。

Scikit-learn Pipeline:优雅地串联流程Scikit-learn的Pipeline功能是一个非常实用的工具,它能将预处理、特征提取和模型训练这些步骤串联起来,形成一个统一的工作流。这不仅让代码更简洁,也避免了数据泄露(data leakage)的问题,确保特征提取器只在训练数据上“学习”词汇表。

from sklearn.feature_extraction.text import TfidfVectorizerfrom sklearn.naive_bayes import MultinomialNBfrom sklearn.pipeline import Pipelinefrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import classification_report# 示例数据texts = [    "这是一个关于科技的新闻。",    "苹果发布了新款手机。",    "今天的电影真好看,推荐给大家。",    "这部电影的情节扣人心弦。",    "经济增长放缓,股市波动。",    "央行宣布降息,刺激经济。"]labels = ["科技", "科技", "娱乐", "娱乐", "财经", "财经"]# 划分训练集和测试集X_train, X_test, y_train, y_test = train_test_split(texts, labels, test_size=0.3, random_state=42)# 构建Pipeline:TF-IDF特征提取 + 朴素贝叶斯分类器text_classifier = Pipeline([    ('tfidf', TfidfVectorizer()),    ('clf', MultinomialNB()),])# 训练模型text_classifier.fit(X_train, y_train)# 进行预测predictions = text_classifier.predict(X_test)# 评估模型print(classification_report(y_test, predictions))# 尝试预测新文本new_texts = ["这部手机的性能很棒。", "关于金融的最新报道。"]new_predictions = text_classifier.predict(new_texts)print(f"新文本预测结果: {new_predictions}")

为什么文本分类如此重要?它能解决哪些实际问题?

文本分类在现代信息社会中扮演着举足轻重的角色,我个人觉得它简直是处理海量非结构化文本数据的“瑞士军刀”。刚接触这块时,我一度觉得不就是给文章贴标签嘛,后来才意识到它背后能支撑起多少自动化流程,简直是信息过载时代的救星。

它能解决的实际问题非常广泛:

垃圾邮件识别: 最经典的例子。通过分析邮件内容,自动判断是否为垃圾邮件并进行过滤。情感分析: 理解用户对产品、服务或事件的评论是积极、消极还是中立。这在市场调研、舆情监控和客户服务中极其有用。比如,分析电商评论来改进产品,或者识别社交媒体上的负面言论及时响应。新闻分类与推荐: 自动将新闻文章归类到体育、财经、科技等不同主题,方便用户浏览和个性化推荐,像今日头条这类应用的核心功能之一。客户服务与工单路由: 根据客户的咨询内容,自动将问题分配给相应的部门或客服人员,大幅提升响应效率。内容审核与过滤: 识别并过滤掉论坛、社交媒体上的违法、色情、暴力或广告内容,维护社区健康。专利分类与法律文件分析: 帮助专业人士快速定位和理解大量法律文档或专利文本。医疗文本分析: 从病历、医学文献中提取关键信息,辅助诊断或研究。

这些应用场景无一不体现出文本分类在自动化、效率提升和信息管理方面的巨大价值。它将原本需要人工耗时完成的任务,变得高效且可规模化。

如何选择合适的文本特征提取方法?CountVectorizer与TfidfVectorizer的取舍

选择文本特征提取方法,就像是给文本数据选择一副合适的“眼镜”,不同的眼镜能让我们看到数据不同的侧面。在Scikit-learn中,CountVectorizerTfidfVectorizer是最常用的两种,它们各有优缺点,没有绝对的“最好”,只有“更适合”特定场景的。

CountVectorizer(词袋模型)

原理: 简单粗暴地统计每个词在文档中出现的次数。每个文档被表示为一个向量,向量的每个维度对应一个词,值是该词的出现频率。优点:直观易懂: 它的逻辑非常直接,就是数数。保留词频信息: 如果你认为词语出现的次数本身就带有重要信息(比如,某个词重复出现多次就代表了强调),那么CountVectorizer能很好地保留这一点。计算速度快: 相对来说,它的计算量较小。缺点:忽略词语的重要性: 像“的”、“是”这类高频词,在所有文档中都大量出现,但它们的信息量很低,CountVectorizer会赋予它们很高的权重,这可能会干扰模型对真正关键词的识别。维度灾难: 如果词汇量非常大,生成的向量维度会非常高,导致模型训练效率下降,甚至过拟合。适用场景:数据量较小,词汇表不那么庞大的情况。当词语的绝对频率本身就是重要特征时。作为快速的基线模型,看看效果如何。

TfidfVectorizer(TF-IDF模型)

原理: 在词频(TF)的基础上,加入了逆文档频率(IDF)的概念。TF衡量词在当前文档中的重要性,IDF衡量词在整个语料库中的稀有程度。TF-IDF值越高,说明这个词在当前文档中出现频繁,但在其他文档中很少出现,因此更能代表当前文档的特点。优点:突出关键词: 能够有效降低“的”、“是”这类通用词的权重,同时提升那些在特定文档中频繁出现但在整个语料库中相对稀有的词的权重。这通常能更好地捕捉文档的主题信息。性能优越: 在大多数文本分类任务中,TfidfVectorizer往往能提供比CountVectorizer更好的分类性能。缺点:丢失原始词频信息: TF-IDF值是经过加权的,原始的词频信息被“稀释”了。在某些需要精确词频的任务中,这可能是一个劣势。计算略复杂: 相较于CountVectorizer,需要额外计算IDF值。适用场景:绝大多数通用文本分类任务。需要识别文档独特主题或关键词的场景。处理大量文本数据时,它能有效降噪。

我的取舍心得:

很多时候,我发现TfidfVectorizer在初期就能提供更好的性能,它对那些在特定文档中频繁出现但在整个语料库中不那么普遍的词语更敏感。这使得模型能更好地聚焦于文档的“特色词”。但也不是说CountVectorizer就没用,对于某些特定任务,比如关键词密度分析,或者当你的语料库非常小,词汇量有限时,CountVectorizer可能更直观,甚至能取得不错的效果。

在实际操作中,我通常会先尝试TfidfVectorizer作为基线,如果效果不理想,或者有特殊需求,才会考虑回溯到CountVectorizer,或者进一步探索更复杂的特征,比如词嵌入(Word Embeddings,如Word2Vec、GloVe,虽然它们不在Scikit-learn的直接范畴内,但可以通过其他库结合使用)。同时,别忘了n-gram这个概念,无论是CountVectorizer还是TfidfVectorizer,都可以通过设置ngram_range参数来提取词组(如“非常 好看”作为一个整体),这能捕捉到词语之间的序列信息,有时能显著提升模型性能。

面对不平衡数据集,文本分类模型如何优化?

数据不平衡是真实世界文本分类任务中非常常见,也让人头疼的问题。比如,在垃圾邮件识别中,正常邮件的数量远多于垃圾邮件;在情感分析中,正面评论可能远多于负面评论。如果直接用这样的数据训练模型,模型很可能会偏向数量多的类别(多数类),而对数量少的类别(少数类)的识别能力很差。我曾经在一个产品评论分类的项目中遇到过严重的数据不平衡问题,正面评论远多于负面。一开始模型对负面评论的识别率奇低,后来尝试了多种策略,F1分数才有了显著提升。这真的让我意识到,光看准确率是远远不够的,尤其是在这种真实世界的数据集里。

以下是几种常用的优化策略:

1. 评估指标的选择:别只盯着准确率

这是第一步,也是最重要的一步。当数据不平衡时,一个模型即使把所有样本都预测成多数类,也可能获得一个看似很高的准确率。因此,我们应该关注:

精确率 (Precision)召回率 (Recall):特别是少数类的精确率和召回率。F1-Score: 精确率和召回率的调和平均,能更好地综合衡量模型性能。混淆矩阵 (Confusion Matrix): 直观地看到模型在每个类别上的分类情况,特别是少数类的假阳性 (False Positives) 和假阴性 (False Negatives)。ROC曲线和AUC值: 对于二分类问题,AUC值能够衡量模型区分正负样本的能力,它对类别不平衡不那么敏感。

2. 数据层面的策略:调整样本分布

这是最直接的解决办法,通过改变训练数据的分布来“欺骗”模型,让它更关注少数类。

过采样 (Oversampling): 增加少数类的样本数量。随机过采样: 简单复制少数类样本。缺点是可能导致过拟合。SMOTE (Synthetic Minority Over-sampling Technique): 这是更高级的方法,它通过在少数类样本之间插值来生成新的合成样本,而不是简单复制。这能增加少数类的多样性,降低过拟合风险。在Python中,imbalanced-learn库提供了SMOTE的实现。欠采样 (Undersampling): 减少多数类的样本数量。随机欠采样: 随机删除多数类样本。缺点是可能丢失多数类的重要信息。Tomek Links / NearMiss 等: 更智能的欠采样方法,尝试删除那些对分类边界贡献较小的多数类样本,或者删除与少数类样本过于接近的多数类样本。

我的经验: 我通常会优先考虑过采样,尤其是SMOTE,因为它不会丢失原始数据的信息。欠采样虽然能平衡数据,但丢弃信息总让我有点不安,除非数据量实在太大,不得不为之。

3. 算法层面的策略:让模型更关注少数类

有些机器学习算法本身就提供了处理数据不平衡的机制。

类别权重 (Class Weights): 许多Scikit-learn分类器(如LogisticRegression, SVC, RandomForestClassifier等)都支持class_weight参数。你可以将其设置为'balanced',这样模型在训练时会自动根据类别样本的比例,给少数类更高的惩罚权重,让模型更重视对少数类的正确分类。

from sklearn.linear_model import LogisticRegression# ... 你的数据和特征提取 ...model = LogisticRegression(class_weight='balanced')model.fit(X_train_features, y_train)

这个方法非常简洁有效,通常是我在尝试数据重采样之前的首选。

代价敏感学习 (Cost-Sensitive Learning): 更进一步,你可以手动为不同类别的错误分类设置不同的代价。例如,将少数类被错误分类为多数类的代价设置得很高,促使模型更谨慎地进行预测。集成学习 (Ensemble Methods):Bagging (如Random Forest): 通过在不同子集上训练多个模型并投票,有助于处理不平衡数据。Boosting (如AdaBoost, Gradient Boosting): 这些算法在迭代过程中会更关注那些被错误分类的样本,自然地对少数类给予更多关注。特别是AdaBoost,它会增加少数类样本的权重。

4. 结合多种策略

在实际项目中,往往需要结合多种策略才能达到最佳效果。比如,可以先用SMOTE进行过采样,再用带有class_weight='balanced'参数的分类器进行训练。不断地实验和评估,是解决数据不平衡问题的关键。记住,没有银弹,只有最适合你当前数据的方案。

以上就是Python如何进行文本分类?Scikit-learn实践的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1363255.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月14日 03:18:24
下一篇 2025年12月14日 03:18:34

相关推荐

  • CSS mask属性无法获取图片:为什么我的图片不见了?

    CSS mask属性无法获取图片 在使用CSS mask属性时,可能会遇到无法获取指定照片的情况。这个问题通常表现为: 网络面板中没有请求图片:尽管CSS代码中指定了图片地址,但网络面板中却找不到图片的请求记录。 问题原因: 此问题的可能原因是浏览器的兼容性问题。某些较旧版本的浏览器可能不支持CSS…

    2025年12月24日
    900
  • Uniapp 中如何不拉伸不裁剪地展示图片?

    灵活展示图片:如何不拉伸不裁剪 在界面设计中,常常需要以原尺寸展示用户上传的图片。本文将介绍一种在 uniapp 框架中实现该功能的简单方法。 对于不同尺寸的图片,可以采用以下处理方式: 极端宽高比:撑满屏幕宽度或高度,再等比缩放居中。非极端宽高比:居中显示,若能撑满则撑满。 然而,如果需要不拉伸不…

    2025年12月24日
    400
  • 如何让小说网站控制台显示乱码,同时网页内容正常显示?

    如何在不影响用户界面的情况下实现控制台乱码? 当在小说网站上下载小说时,大家可能会遇到一个问题:网站上的文本在网页内正常显示,但是在控制台中却是乱码。如何实现此类操作,从而在不影响用户界面(UI)的情况下保持控制台乱码呢? 答案在于使用自定义字体。网站可以通过在服务器端配置自定义字体,并通过在客户端…

    2025年12月24日
    800
  • 如何在地图上轻松创建气泡信息框?

    地图上气泡信息框的巧妙生成 地图上气泡信息框是一种常用的交互功能,它简便易用,能够为用户提供额外信息。本文将探讨如何借助地图库的功能轻松创建这一功能。 利用地图库的原生功能 大多数地图库,如高德地图,都提供了现成的信息窗体和右键菜单功能。这些功能可以通过以下途径实现: 高德地图 JS API 参考文…

    2025年12月24日
    400
  • 如何使用 scroll-behavior 属性实现元素scrollLeft变化时的平滑动画?

    如何实现元素scrollleft变化时的平滑动画效果? 在许多网页应用中,滚动容器的水平滚动条(scrollleft)需要频繁使用。为了让滚动动作更加自然,你希望给scrollleft的变化添加动画效果。 解决方案:scroll-behavior 属性 要实现scrollleft变化时的平滑动画效果…

    2025年12月24日
    000
  • 如何为滚动元素添加平滑过渡,使滚动条滑动时更自然流畅?

    给滚动元素平滑过渡 如何在滚动条属性(scrollleft)发生改变时为元素添加平滑的过渡效果? 解决方案:scroll-behavior 属性 为滚动容器设置 scroll-behavior 属性可以实现平滑滚动。 html 代码: click the button to slide right!…

    2025年12月24日
    500
  • 为什么设置 `overflow: hidden` 会导致 `inline-block` 元素错位?

    overflow 导致 inline-block 元素错位解析 当多个 inline-block 元素并列排列时,可能会出现错位显示的问题。这通常是由于其中一个元素设置了 overflow 属性引起的。 问题现象 在不设置 overflow 属性时,元素按预期显示在同一水平线上: 不设置 overf…

    2025年12月24日 好文分享
    400
  • 网页使用本地字体:为什么 CSS 代码中明明指定了“荆南麦圆体”,页面却仍然显示“微软雅黑”?

    网页中使用本地字体 本文将解答如何将本地安装字体应用到网页中,避免使用 src 属性直接引入字体文件。 问题: 想要在网页上使用已安装的“荆南麦圆体”字体,但 css 代码中将其置于第一位的“font-family”属性,页面仍显示“微软雅黑”字体。 立即学习“前端免费学习笔记(深入)”; 答案: …

    2025年12月24日
    000
  • 如何选择元素个数不固定的指定类名子元素?

    灵活选择元素个数不固定的指定类名子元素 在网页布局中,有时需要选择特定类名的子元素,但这些元素的数量并不固定。例如,下面这段 html 代码中,activebar 和 item 元素的数量均不固定: *n *n 如果需要选择第一个 item元素,可以使用 css 选择器 :nth-child()。该…

    2025年12月24日
    200
  • 使用 SVG 如何实现自定义宽度、间距和半径的虚线边框?

    使用 svg 实现自定义虚线边框 如何实现一个具有自定义宽度、间距和半径的虚线边框是一个常见的前端开发问题。传统的解决方案通常涉及使用 border-image 引入切片图片,但是这种方法存在引入外部资源、性能低下的缺点。 为了避免上述问题,可以使用 svg(可缩放矢量图形)来创建纯代码实现。一种方…

    2025年12月24日
    100
  • 如何解决本地图片在使用 mask JS 库时出现的跨域错误?

    如何跨越localhost使用本地图片? 问题: 在本地使用mask js库时,引入本地图片会报跨域错误。 解决方案: 要解决此问题,需要使用本地服务器启动文件,以http或https协议访问图片,而不是使用file://协议。例如: python -m http.server 8000 然后,可以…

    2025年12月24日
    200
  • 旋转长方形后,如何计算其相对于画布左上角的轴距?

    绘制长方形并旋转,计算旋转后轴距 在拥有 1920×1080 画布中,放置一个宽高为 200×20 的长方形,其坐标位于 (100, 100)。当以任意角度旋转长方形时,如何计算它相对于画布左上角的 x、y 轴距? 以下代码提供了一个计算旋转后长方形轴距的解决方案: const x = 200;co…

    2025年12月24日
    000
  • 旋转长方形后,如何计算它与画布左上角的xy轴距?

    旋转后长方形在画布上的xy轴距计算 在画布中添加一个长方形,并将其旋转任意角度,如何计算旋转后的长方形与画布左上角之间的xy轴距? 问题分解: 要计算旋转后长方形的xy轴距,需要考虑旋转对长方形宽高和位置的影响。首先,旋转会改变长方形的长和宽,其次,旋转会改变长方形的中心点位置。 求解方法: 计算旋…

    2025年12月24日
    000
  • 旋转长方形后如何计算其在画布上的轴距?

    旋转长方形后计算轴距 假设长方形的宽、高分别为 200 和 20,初始坐标为 (100, 100),我们将它旋转一个任意角度。根据旋转矩阵公式,旋转后的新坐标 (x’, y’) 可以通过以下公式计算: x’ = x * cos(θ) – y * sin(θ)y’ = x * …

    2025年12月24日
    000
  • 如何让“元素跟随文本高度,而不是撑高父容器?

    如何让 元素跟随文本高度,而不是撑高父容器 在页面布局中,经常遇到父容器高度被子元素撑开的问题。在图例所示的案例中,父容器被较高的图片撑开,而文本的高度没有被考虑。本问答将提供纯css解决方案,让图片跟随文本高度,确保父容器的高度不会被图片影响。 解决方法 为了解决这个问题,需要将图片从文档流中脱离…

    2025年12月24日
    000
  • 为什么我的特定 DIV 在 Edge 浏览器中无法显示?

    特定 DIV 无法显示:用户代理样式表的困扰 当你在 Edge 浏览器中打开项目中的某个 div 时,却发现它无法正常显示,仔细检查样式后,发现是由用户代理样式表中的 display none 引起的。但你疑问的是,为什么会出现这样的样式表,而且只针对特定的 div? 背后的原因 用户代理样式表是由…

    2025年12月24日
    200
  • 如何计算旋转后长方形在画布上的轴距?

    旋转后长方形与画布轴距计算 在给定的画布中,有一个长方形,在随机旋转一定角度后,如何计算其在画布上的轴距,即距离左上角的距离? 以下提供一种计算长方形相对于画布左上角的新轴距的方法: const x = 200; // 初始 x 坐标const y = 90; // 初始 y 坐标const w =…

    2025年12月24日
    200
  • CSS元素设置em和transition后,为何载入页面无放大效果?

    css元素设置em和transition后,为何载入无放大效果 很多开发者在设置了em和transition后,却发现元素载入页面时无放大效果。本文将解答这一问题。 原问题:在视频演示中,将元素设置如下,载入页面会有放大效果。然而,在个人尝试中,并未出现该效果。这是由于macos和windows系统…

    2025年12月24日
    200
  • inline-block元素错位了,是为什么?

    inline-block元素错位背后的原因 inline-block元素是一种特殊类型的块级元素,它可以与其他元素行内排列。但是,在某些情况下,inline-block元素可能会出现错位显示的问题。 错位的原因 当inline-block元素设置了overflow:hidden属性时,它会影响元素的…

    2025年12月24日
    000
  • 为什么 CSS mask 属性未请求指定图片?

    解决 css mask 属性未请求图片的问题 在使用 css mask 属性时,指定了图片地址,但网络面板显示未请求获取该图片,这可能是由于浏览器兼容性问题造成的。 问题 如下代码所示: 立即学习“前端免费学习笔记(深入)”; icon [data-icon=”cloud”] { –icon-cl…

    2025年12月24日
    200

发表回复

登录后才能评论
关注微信