NLP特征提取的惊人历史演变

NLP特征提取的惊人演变

  • 1.理解特征提取
  • 2. 文本表示的演变
    • 2.1.词袋的简单性
    • 2.2. N-Gram 模型的进步
    • 2.3. TF-IDF 的崛起
  • 3. 深入研究词嵌入
    • 3.1.探索 Word2Vec
    • 3.2.深入了解 GloVe
    • 3.3.深入研究 FastText
  • 4. 上下文嵌入的影响
    • 4.1 ELMo 的突破
    • 4.2 理解 BERT 的机制
    • 4.3 Transformer的出现
  • 结语

1.理解特征提取

特征提取是自然语言处理(NLP)中的一个关键过程。它将原始数据转换为结构化格式,使机器学习算法能够高效工作。词嵌入是一种复杂的特征提取形式,能够捕捉单词之间的语义关系。

让我们从基础开始。BoW(Bag-of-Words) 模型将文本表示为一个无序的单词集合,忽略语法和单词顺序。这种简单性既是它的优点也是它的局限。在此基础上改进的 n-gram 模型考虑了 ‘n’ 个单词的序列,捕捉更多的上下文信息。然而,它仍然无法完全反映单词的语义。TF-IDF(Term Frequency-Inverse Document Frequency ) 方法根据单词的重要性进行加权。它是基于一组文档计算的,反映了一个单词对于特定文档的相关性

现在,谈到词嵌入。它们是由实数构成的稠密向量,每个维度表示一个单词的潜在特征。流行的模型包括 Word2VecGloVe(Global Vectors for Word Representation)FastText。这些模型从大量文本数据中学习单词关联,能够捕捉复杂的单词关系,如同义词和反义词。

最后,像 ELMo(Embeddings from Language Models)BERT 这样的上下文嵌入考虑了上下文,每个单词的表示根据周围文本而变化,这导致了对语言细微差别的更深理解。


2. 文本表示的演变

文本表示经历了显著的变革,从简单模型发展到复杂结构。最初,NLP 中的特征提取依赖于词袋模型。这种模型将文本视为一个无序的单词集合,忽略语法和单词顺序但保留了多样性。

词袋模型虽然简单,但常常导致稀疏和高维数据。它对小型数据集有效,但难以处理语言的细微差别。为了解决这个问题,N-Gram 模型被开发出来,考虑了 ‘N’ 个单词的序列,从而捕捉了一些上下文。进一步的进展导致了 TF-IDF 模型。TF-IDF 根据单词的重要性进行加权,重要性与单词在整个文档集中的频率成反比。这有助于突出文档内容中更为独特的术语。然而,这些方法仍然缺乏语义理解。词嵌入的出现是特征提取的突破。词嵌入是单词的稠密向量表示,能够捕捉单词的意义、细微差别及其与其他单词的关系。它们在大型语料库上训练,能够理解上下文和语义相似性。

Word2VecGloVe 等模型在推动词嵌入方面发挥了重要作用。Word2Vec 使用神经网络从大数据集中学习单词关联,而 GloVe 结合了矩阵分解和基于上下文的学习。这两个模型显著改善了机器对人类语言的理解方式。

随着 NLP 的不断发展,我们见证了上下文嵌入的兴起。与传统嵌入不同,上下文模型如 ELMoBERTTransformer 架构考虑了句子或段落的整体上下文。这允许更细致的理解,并在语言建模中树立了新标准。

总之,NLP 中文本表示的演变对于该领域的进展至关重要。从简单的词袋模型到复杂的词嵌入及其更高形式,这些进步为机器更准确和更人性化的语言处理铺平了道路。

2.1.词袋的简单性

自然语言处理 (NLP) 中的特征提取对于将文本转换为算法可以处理的格式至关重要。词袋 (BoW) 模型是完成此任务的一种简单而强大的方法。它涉及以下步骤:

# 通过sklearn库创建一个 Bag-of-Words 模型
from sklearn.feature_extraction.text import CountVectorizer  # 例文 
documents = ["Text analytics with Python", "Python for data science"]  # 创建 BoW 模型  
vectorizer = CountVectorizer()  
bow_matrix = vectorizer.fit_transform(documents)  # 查看 BoW   
print(bow_matrix.toarray())

词袋模型(BoW)将文本转换为一个词频矩阵。它忽略了语法和单词顺序,仅关注单词的出现频率。虽然这种简单性是它的优点,但也是它的局限,因为上下文和语义丢失了。

随着我们迈向更复杂的词嵌入,记住词袋模型为未来特征提取的进步奠定了基础是很重要的。

2.2. N-Gram 模型的进步

N-Gram 模型显著推动了自然语言处理(NLP)中特征提取的发展。这些模型将 n 个单词的序列视为一个单一特征,从而捕捉到了词袋模型中常常被忽视的上下文信息
请添加图片描述

以下是它们如何增强文本表示的方法:

首先,N-Gram 模型在一定程度上保留了单词顺序。例如,一个二元模型(n=2)会将“not good”与“good”区别对待。这个简单的变化允许对文本情感和意义的更细致理解。

其次,N-Gram 模型易于实现。以下是一个简单的 Python 示例,用于构建一个二元模型:

def generate_bigrams(text):  tokens = text.split()  bigrams = zip(tokens, tokens[1:])  return [" ".join(bigram) for bigram in bigrams]

最后,N-Gram 模型为更复杂的算法奠定了基础。它们是迈向更复杂词嵌入的垫脚石,我们将在接下来的部分中探讨这些嵌入。

虽然 N-Grams 增加了上下文,但它们也增加了特征空间的维度,这可能是一个缺点。然而,它们对文本表示演变的贡献是不可否认的,为 TF-IDF 和词嵌入等更先进的技术铺平了道路。

2.3. TF-IDF 的崛起

词频-逆文档频率(TF-IDF)作为一种统计测量方法出现,用于评估单词在文档集合或语料库中的重要性。它通过一种更精细的方法增强了词袋模型在 NLP 中的特征提取能力。

请添加图片描述

TF-IDF 由两个部分组成:

  • 词频(TF):一个单词在文档中出现的频率,表明其重要性。
  • 逆文档频率(IDF):缩减在多个文档中频繁出现的单词的权重。

结合起来,TF-IDF 突出了在单个文档中频繁出现但在多个文档中不常见的单词。这有助于区分文档中术语的重要性。

在 Python 中使用 scikit-learn 库实现 TF-IDF 非常简单。以下是一个基本的设置示例:

# 计算 TF-IDF  
from sklearn.feature_extraction.text import TfidfVectorizer  
documents = ['your document text here']  
vectorizer = TfidfVectorizer()  
tfidf_matrix = vectorizer.fit_transform(documents)

理解 TF-IDF 对于在 NLP 中的进步至关重要,它是迈向掌握语言模式细微差别的垫脚石,为更复杂的模型如词嵌入做好准备。


3. 深入研究词嵌入

词嵌入是自然语言处理(NLP)中特征提取的一种形式。它们将文本转换为机器可以理解的数值向量。与简单模型不同,词嵌入能够捕捉单词之间的语义关系。

让我们来探讨一些流行的模型:

Word2Vec 使用神经网络从大型数据集中学习单词关联。它有两种变体:CBOW(Continuous Bag of Words)Skip-Gram
CBOW根据 上下文预测一个单词
请添加图片描述

上图是CBOW

而 Skip-Gram 则相反,根据一个词来预测周围的词

请添加图片描述

上图是Skip-Gram
#  Word2Vec 的代码片段 
from gensim.models import Word2Vec  
sentences = [['word1', 'word2', 'word3'], ['word2', 'word3']]  
model = Word2Vec(sentences, min_count=1)

GloVe,全称为全球词向量,是另一种方法,侧重于整个语料库中的单词共现。其嵌入反映了两个单词一起出现的概率

#  GloVe  的代码片段  
import glove  
from glove import Corpus, Glove  
corpus = Corpus()  
corpus.fit(sentences, window=10)  
glove = Glove(no_components=100, learning_rate=0.05)  
glove.fit(corpus.matrix, epochs=30, no_threads=4, verbose=True)  
glove.add_dictionary(corpus.dictionary)

FastText 扩展了 Word2Vec考虑了子词信息。这有助于在形态丰富的语言或拼写错误的单词中捕捉意义。

# FastText 的代码片段    
from gensim.models import FastText  
model_ft = FastText(sentences, size=100, window=5, min_count=5, workers=4, sg=1)

这些模型革命性地改变了我们在计算系统中理解和处理语言的方式,带来了更细致和有效的 NLP 应用。

3.1.探索 Word2Vec

Word2Vec 是 NLP 特征提取中的关键一步。它将单词转换为数值形式,使机器能够理解我们的语言。让我们深入了解如何利用 Word2Vec 进行 NLP 任务。
请添加图片描述

首先,安装提供 Word2Vec 实现的 gensim 库

pip install gensim

接下来,导入 Word2Vec 并使用语料库训练模型:

from gensim.models import Word2Vec  
sentences = [['this', 'is', 'the', 'first', 'sentence'], ['this', 'is', 'the', 'second', 'sentence']]  
model = Word2Vec(sentences, min_count=1)

训练完成后,可以获得语料库中任何单词的词嵌入:

vector = model.wv['sentence']

Word2Vec 提供了两种架构:CBOW(连续词袋模型)和 Skip-Gram。

以下是指定架构的方法:

cbow_model = Word2Vec(sentences, min_count=1, sg=0)  
skipgram_model = Word2Vec(sentences, min_count=1, sg=1)

使用 Word2Vec,我们在特征提取方面迈出了重要的一步。这些词嵌入捕捉了语义关系,丰富了 NLP 应用。

3.2.深入了解 GloVe

GloVe,全称为全球词向量,是 NLP 领域中一种强大的特征提取方法。它结合了两大模型家族的优点:全局矩阵分解局部上下文窗口方法
请添加图片描述

以下是如何理解和利用 GloVe:

首先,GloVe 构建了一个大型矩阵,捕捉单词在上下文中共现的频率。这个矩阵提供了语料库中单词使用的全局统计信息。与词袋模型不同,词袋模型将每个文档独立对待,而 GloVe 在共享空间中捕捉单词之间的关系。

以下是加载预训练 GloVe 嵌入的简单 Python 代码示例:

import numpy as np  def load_glove_embeddings(path):  with open(path, 'r', encoding='utf-8') as f:  words, embeddings = zip(*[line.strip().split(' ', 1) for line in f])  word_to_index = {word: idx for idx, word in enumerate(words)}  embeddings_matrix = np.array([np.fromstring(embed, sep=' ') for embed in embeddings])  return word_to_index, embeddings_matrix  glove_path = 'path/to/glove.txt'  
word_to_index, embeddings_matrix = load_glove_embeddings(glove_path)

加载后,这些嵌入可以用于将文本数据转换为数值形式,使其准备好用于各种机器学习模型。像 GloVe 这样的词嵌入的优势在于它们能够捕捉语义意义,并在多维空间中关联单词。

请记住,虽然 GloVe 为特征提取提供了坚实的基础,但为优化性能,需要根据具体的 NLP 任务进行调整。。

3.3.深入研究 FastText

FastText 是 NLP 中一个强大的特征提取工具,它扩展了 Word2Vec 模型,考虑了子词信息。这种方法使 FastText 能够捕捉较短单词的意义,并理解词缀和前缀,使其在具有丰富形态的语言中尤其有用。

以下是使用 Python 的 FastText 的简单示例:

from gensim.models import FastText  
model = FastText(window=3, min_count=1)  
model.build_vocab(sentences=data)  
model.train(sentences=data, total_examples=len(data), epochs=10)

通过将每个单词看作是字符 n-gram 的集合,FastText 能为不常见的单词,甚至是训练过程中未见过的单词生成更好的词嵌入。这相对于传统模型而言是一个显著的优势,因为传统模型无法为词汇表外(OOV)的单词提供向量。

FastText 处理 OOV 单词的能力以及通过内部结构表示每个单词的稳健性,使其成为 NLP 特征提取工具包中的重要补充。


4. 上下文嵌入的影响

上下文嵌入(Contextual Embeddings)彻底改变了我们在自然语言处理(NLP)中理解单词的方式。与传统方法不同,上下文嵌入捕捉到语言的动态特性。这使得基于上下文更深入地理解单词的含义成为可能。

这一领域的关键进展之一是 ELMo(来自语言模型的嵌入)的开发。ELMo 考虑整个句子来确定单词的意义,它显著提高了各种 NLP 任务的性能。

继 ELMo 之后,BERT(双向编码器表示的转换器)更进一步。BERT 分析单词与句子中所有其他单词的关系,而不是孤立地看待单词。这导致了更细致的语言模型。

Transformer模型,如 BERT,使用注意力机制来衡量句子中所有单词的相关性。这对 NLP 中的特征提取来说是一个革命性的变化。它使得预测更加准确,并且更好地理解语言的细微差别。

这些进步为更复杂的 NLP 应用铺平了道路。它们改进了机器翻译、问答系统和文本摘要。词嵌入现在能够提供更丰富的文本数据表示。

在将这些技术整合到工作中时,请记住上下文的力量。单词的意义不仅在于它们本身,还在于它们的使用方式。

# 使用 BERT 提取特征
from transformers import BertModel, BertTokenizer  
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')  
model = BertModel.from_pretrained('bert-base-uncased')  # 分词和特征提取 
inputs = tokenizer("Hello, how are you?", return_tensors="pt")  
outputs = model(**inputs)

通过利用这些模型,可以提取真正掌握语言本质的特征。这对于构建能够更有效地理解人类语言的健全 NLP 系统至关重要。

4.1 ELMo 的突破

ELMo代表了自然语言处理(NLP)中特征提取的一个重大进步。该技术利用深度上下文化的词嵌入来捕捉语法和语义,以及多义性——具有多重含义的单词。
请添加图片描述

与传统嵌入不同,ELMo 在分析单词时考虑了周围文本的上下文,从而实现了更丰富的理解。以下是 Python 中的一个简化示例:

from allennlp.modules.elmo import Elmo, batch_to_ids  # 初始化 ELMo  
options_file = 'elmo_options.json'  
weight_file = 'elmo_weights.hdf5'  
elmo = Elmo(options_file, weight_file, num_output_representations=1)  # 例句  
sentences = [['I', 'have', 'a', 'green', 'apple'], ['I', 'have', 'a', 'green', 'thumb']]  # 转化为特征索引  
character_ids = batch_to_ids(sentences)  # 得到 ELMo 编码  
embeddings = elmo(character_ids)

ELMo 的动态词嵌入是一个游戏规则改变者,提供了反映不同上下文中不同意义的细致词表示。这为更复杂的 NLP 应用铺平了道路,提升了特征提取及其他任务的性能。

4.2 理解 BERT 的机制

BERT在特征提取和词嵌入方面是一种突破性的方法。它彻底改变了机器理解人类语言的方式。通过在大规模语料库上进行预训练,BERT 捕捉到了复杂的模式和细微差别。

请添加图片描述

BERT 的核心机制依赖于Transformer架构。与之前的模型不同,它处理单词时考虑了句子中所有其他单词的关系,而不是逐个处理。这使得对上下文的理解更为深入。

#  BERT 分词器
from transformers import BertTokenizer  
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')  
tokens = tokenizer.tokenize("Hello, how are you?")  
print(tokens)

这种上下文词嵌入意味着单词“bank”在“river bank”和“savings bank”中的表示会有所不同。这种细微差别对于在复杂的 NLP 任务中进行准确的特征提取至关重要。

4.3 Transformer的出现

转换器模型彻底改变了自然语言处理(NLP)领域。它引入了一种完全依赖自注意力机制的新颖架构,消除了对循环层的需求。这一改变允许了前所未有的并行化,大大减少了训练时间,并改进了需要理解文本中长距离依赖的任务的性能。

请添加图片描述

特征提取和词嵌入通过转换器获得了新的维度。它们通过处理句子中所有其他单词的关系来捕捉上下文细微差别,而不是孤立地处理单词。这导致了反映语言多义性的嵌入,其中单词的意义可以根据上下文而变化。

以下是使用 Hugging Face 库提取嵌入的一个简单 Python 示例:

from transformers import BertModel, BertTokenizer  
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')  
model = BertModel.from_pretrained('bert-base-uncased')  
inputs = tokenizer("Hello, world!", return_tensors="pt")  
outputs = model(**inputs)

像 BERT 和 GPT 这样的转换器已经为 NLP 中的特征提取设定了新标准,使文本表示更为细致和有效。它们理解上下文的能力为众多应用的进步铺平了道路,从机器翻译到情感分析。

结语

特征提取技术在NLP中的演变,从词袋模型到现代的上下文嵌入,极大地提升了机器对语言的理解能力。通过利用如Word2Vec、GloVe和BERT等模型,NLP应用能够更准确地捕捉语义和上下文细节。这些进步为更复杂的语言处理任务铺平了道路,推动了NLP领域的持续发展!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/864205.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

44 - 50题高级字符串函数 / 正则表达式 / 子句 - 高频 SQL 50 题基础版

目录 1. 相关知识点2.例子2.44 - 修复表中的名字2.45 - 患某种疾病的患者2.46 - 删除重复的电子邮箱2.47 - 第二高的薪水2.48 - 按日期分组销售产品2.49 - 列出指定时间段内所有的下单产品2.50 - 查找拥有有效邮箱的用户 1. 相关知识点 相关函数 函数含义concat()字符串拼接upp…

Ollama中文版部署

M1部署Ollama Ollama中文网站: Featured - 精选 - Ollama中文网 下载网址: Download Ollama on macOS 安装后运行llma3模型: ollama run llama3:8b 界面使用: GitHub - open-webui/open-webui: User-friendly WebUI for LLMs (Formerly Ollama WebUI) 部署open-webui: do…

两个li标签之间有空格这是什么原因

<li> 标签之间出现的空格可能由多种原因造成。以下是一些常见的原因&#xff1a; HTML源代码中的空格&#xff1a;如果你在HTML源代码中直接在两个 <li> 标签之间输入了空格或制表符&#xff08;Tab&#xff09;&#xff0c;这些空格可能会被浏览器渲染出来。不过&…

烟台网站建设前需要了解哪些

在进行烟台网站建设之前&#xff0c;需要了解以下几个重要的方面&#xff1a; 1. 目标和定位&#xff1a;在建设网站之前&#xff0c;需要明确网站的目标和定位。是为了展示公司业务&#xff0c;还是为了销售产品&#xff0c;或者是为了提供信息和服务等。根据不同的目标和定位…

界面组件DevExpress WPF v24.1 - 增强的可访问性 UI自动化

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 DevExpress WPF控件日…

mqtt介绍和环境安装

Mqtt介绍 MQTT是机器对机器(M2M)/物联网(IoT)连接协议。它被设计为一个极其轻量级的发布/订阅消息传输协议。对于需要较小代码占用空间和/或网络带宽非常宝贵的远程连接非常有用&#xff0c;是专为受限设备和低带宽、高延迟或不可靠的网络而设计。 下载一个开源的emqx服务器和…

造一个交互式3D火山数据可视化

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 使用 Plotly.js 创建交互式 3D 火山数据可视化 应用场景 本代码用于将火山数据库中的数据可视化&#xff0c;展示火山的高度、类型和状态。可用于地质学研究、教育和数据探索。 基本功能 该代码使用 Plotly…

【代码随想录——单调栈】

1.每日温度 func dailyTemperatures(temperatures []int) []int {stack : list.New()//入栈&#xff1a;stack.PushBack()//出栈&#xff1a;stack.Remove(stack.Back())dp : make([]int, len(temperatures))for i : 0; i < len(temperatures); i {if stack.Len() 0 {stack…

深入解析Linux的使用(上)

深入解析Linux的使用&#xff08;上&#xff09; Linux作为一种开源操作系统&#xff0c;广泛应用于服务器、桌面计算机和嵌入式设备。它以稳定、安全和高效著称。对于新手来说&#xff0c;学习如何使用Linux是一个非常有价值的技能。本文将带你从基础开始&#xff0c;逐步深入…

期末考试后,老师如何高效把成绩发给家长

期末考试终于结束了&#xff0c;老师们是不是感觉松了一口气呢&#xff1f;但是&#xff0c;成绩发布这个环节可不能马虎哦&#xff01;今天&#xff0c;我就来跟大家分享一下如何高效地把成绩发给家长&#xff0c;让这个环节变得既轻松又高效&#xff01; 先把最高效的方式告诉…

ROS2用c++开发参数节点通信

1.创建节点 cd chapt4/chapt4_ws/ ros2 pkg create example_parameters_rclcpp --build-type ament_cmake --dependencies rclcpp --destination-directory src --node-name parameters_basic --maintainer-name "joe" --maintainer-email "1027038527qq.com&…

网安小贴士(1)等级保护

一、定义 等保&#xff0c;即信息安全等级保护&#xff0c;根据信息系统在国家安全、经济建设、社会生活中的重要程度&#xff0c;以及信息系统遭到破坏后对国家安全、社会秩序、公共利益以及公民、法人和其他组织的合法权益的危害程度&#xff0c;将信息系统分为五个不同的安全…

Mybatis中支持缓存的query与不支持缓存的query

mybatis拦截器中&#xff0c;通常添加两个query的签名方法&#xff0c;如下&#xff1a; Intercepts({Signature(type Executor.class,method "query",args {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}),Signature(type Exec…

aforg.net简单应用举例

AForge.NET 是一个基于 C# 的开源框架&#xff0c;它提供了一系列用于图像处理、计算机视觉、神经网络、遗传算法、机器人等领域的类库和工具。以下是一个简单的 AForge.NET 应用示例&#xff0c;涉及图像处理中的边缘检测功能。 假设我们想要对一张图片进行边缘检测&#xff…

【Python机器学习】模型评估与改进——留一法交叉验证

留一法也是一种常见的交叉验证方法。 我们可以将留一法交叉验证看作是每折只包含单个样本的k折交叉验证。对于每次划分&#xff0c;选择单个数据点作为测试集。这种方法可能非常耗时&#xff0c;特征是对于大型数据&#xff0c;但是小型数据集上有时可以给出更好的估计结果&am…

HarmonyOS Next开发学习手册——显示图片 (Image)

开发者经常需要在应用中显示一些图片&#xff0c;例如&#xff1a;按钮中的icon、网络图片、本地图片等。在应用中显示图片需要使用Image组件实现&#xff0c;Image支持多种图片格式&#xff0c;包括png、jpg、bmp、svg和gif&#xff0c;具体用法请参考 Image 组件。 Image通过…

Python 算法交易实验75 QTV200后续想法梳理

说明 在第一步获取数据源&#xff0c;然后进入Mongo(第一个数据节点)开始&#xff0c;QTV200的数据流体系就开始动了。后续用多少时间完成不太好确定&#xff0c;短则数周&#xff0c;长则数月。毕竟有过第一版实验的基础&#xff0c;应该还是可以做到的。 下面就是天马行空&…

Spring Cloud Sentinel

官网代码案例: 注意&#xff1a; 1. 引入依赖 <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> 2. 配置文件application.yml spring:cloud:sent…

MIG IP example中的模型文件 -- ddr3_model.sv、 ddr3_model_parameters.vh、WIREDLY.V

关于Xilinx Vivado中MIG (Memory Interface Generator) IP核自带example中的几个关键文件。 WIREDLY.V 文件: 用途: 这是一个用于模拟弱上拉&#xff08;weak pull-up&#xff09;和弱下拉&#xff08;weak pull-down&#xff09;的Verilog模块。在DDR3仿真中&#xff0c;它用于…

解决Python用xpath爬取不到数据的一个思路

前言 最近在学习Python爬虫的知识&#xff0c;既然眼睛会了难免忍不住要实践一把。 不废话直接上主题 代码不复杂&#xff0c;简单的例子奉上&#xff1a; import requests from lxml import etreecookie 浏览器F12网络请求标头里有 user_agent 浏览器F12网络请求标头里有…