NLP快速入门

NLP入门

课程链接:https://www.bilibili.com/video/BV17K4y1W7yb/?p=1&vd_source=3f265bbf5a1f54aab2155d9cc1250219

参考文档链接1:NLP知识点:Tokenizer分词器 - 掘金 (juejin.cn)

一、分词

分词是什么?

每个字母都有对应的ASCII编码,可以用编码代替一个单词中的不同字母,即表示一个单词

但是对于一个句子,取用编码表示里面的每个单词,而不是对单词里面的字母进行编码

如I love my dog,用001、002、003、004表示,这时候新来一个句子I love my cat,cat就可以用005编码代表,再用编码看一下,分别是[1 2 3 4]和[1 2 3 5],可以看出这两个句子是有一定的相似性的,都是表示对某物的喜爱

Tokenizer了解

计算机无论如何都无法理解人类语言,它只会计算,通过计算它让你感觉它理解了人类语言

  • 举个例子:单=1,双=2,计算机面临“单”和“双”的时候,它所理解的就是2倍关系
  • 再举一个例子:赞美=1,诋毁=0, 当计算机遇到0.5的时候,它知道这是“毁誉参半”
  • 再再举一个例子:女王={1,1},女人={1,0},国王={0,1},它能明白“女人”+“国王”=“女王”

面临文字的时候,都是要通过数字去理解的,如何把文本转成数字,就是NLP中最基础的一步,TensorFlow框架中,提供了一个很好用的类Tokenizer, 它就是为此而生的。

Tokenizer实例常用属性和方法了解

  • tokenizer.word_index给所有单词上了户口,每一个单词都指定了一个身份证编号
  • tokenizer.document_count记录了它处理过几段文本
  • okenizer.index_word和word_index相对,只是数字在前
  • tokenizer.word_docs则统计的是每一个词出现的次数

代码示例

用代码实现上述过程的形式,就是叫做分词,实现用单词用数字来进行表示
假设我们有一批文本,我们想投到分词器中,让他变为数字,既可以按照如下流程实现

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.preprocessing.text import Tokenizer
# 字符串数组表示这些句子
sentences = ["I love my dog","I love my cat","You love my dog!"
]# 创建一个Tokenizer实例,num_words表示要保留的最大单词数,即要保留语料库中出现最频繁的100个单词
tokenizer = Tokenizer(num_words=100)
# 分词器自动实现查看所有文本,并将文本与对应数字进行匹配
tokenizer.fit_on_texts(sentences)
# 通过分词器的word_index属性可以获得完整的单词列表
word_index = tokenizer.word_index
print(word_index)
print(tokenizer.document_count)
print(tokenizer.index_word)
print(tokenizer.word_docs)

输出如下

{'love': 1, 'my': 2, 'i': 3, 'dog': 4, 'cat': 5, 'you': 6}
3
{1: 'love', 2: 'my', 3: 'i', 4: 'dog', 5: 'cat', 6: 'you'}
defaultdict(<class 'int'>, {'love': 3, 'dog': 2, 'i': 2, 'my': 3, 'cat': 1, 'you': 1})

二、序列:将文本转换为数据

texts_to_sequences方法了解

为句子创建数字序列,然后用工具对其进行处理,为训练神经网络做准备

texts_to_sequences方法来将文本序列化为数字,它创建了代表每个句子的token序列

PS:处理是忽略英文字母大小写和英文标点符号的

文本为何能序列化?

文本之所以能被序列化,其基础就是每一个词汇都有一个编号

123456
ilovecatdogyoutoo

未见过的单词如何处理?

当我们遇到没有见过的词汇时,比如 I do not love cat,这时候该怎么办?

举个例子,你做了一个电影情感分析,用20000条电影的好评和差评训练了一个神经网络模型。当你想试验效果的时候,这时候你随便输入一条评论文本,这条新评论文本里面的词汇很有可能之前没出现过,这时候也是要能序列化并给出预测结果的。

先来看会发生什么?

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.preprocessing.text import Tokenizersentences = ["I love my dog","I love my cat","You love my dog!","Do you think my dog is amazing?"
]tokenizer = Tokenizer(num_words=100)
tokenizer.fit_on_texts(sentences)
word_index = tokenizer.word_indextest_data=["i really love my dog","my dog loves my manatee"
]
test_seq = tokenizer.texts_to_sequences(test_data)print(word_index)
print(test_seq)
# {'my': 1, 'love': 2, 'dog': 3, 'i': 4, 'you': 5, 'cat': 6, 'do': 7, 'think': 8, 'is': 9, 'amazing': 10}
# [[4, 2, 1, 3], [1, 3, 1]]

从结果看,它给忽略了,只因为那几个单词没有备案,语料库中没有它们

如果我们并不想忽略它,只需要构建Tokenizer的时候传入一个参数oov_token='<OOV>'

OOV指的是在自然语言文本处理的时候,通常会有一个字词库,它来源于训练数据集,这个词库是有限的。当以后有新的数据集时,这个数据集中有一些词并不在你现有的vocabulary里,我们就说这些词汇是out-of-vocabulary,简称OOV。

只要是通过Tokenizer(oov_token='<OOV>')方式构建的,分词器会给预留一个编号,专门用于标记超纲的词汇

再来看看会发生什么?

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.preprocessing.text import Tokenizersentences = ["I love my dog","I love my cat","You love my dog!","Do you think my dog is amazing?"
]tokenizer = Tokenizer(num_words=100, oov_token="<OOV>")
tokenizer.fit_on_texts(sentences)
word_index = tokenizer.word_indextest_data = ["i really love my dog","my dog loves my manatee"
]
test_seq = tokenizer.texts_to_sequences(test_data)print(word_index)
print(test_seq)
# {'<OOV>': 1, 'my': 2, 'love': 3, 'dog': 4, 'i': 5, 'you': 6, 'cat': 7, 'do': 8, 'think': 9, 'is': 10, 'amazing': 11}
# [[5, 1, 3, 2, 4], [2, 4, 1, 2, 1]]

从结果可见,给超纲词一个编号,它也会输出

序列填充 pad_sequences

训练神经网络时候,如何处理不同长度的句子呢?对于图像而言,通常尺寸是相同的,那么对于文本如何?

进阶的解决方案是借助不规则张量(Ragged Tensor),但是难度过大,另种解决方案较为简单,对于文本中也有像图像padding一样的东西

你看下面这张图,是两捆铅笔,你觉得不管是收纳还是运输,哪一个更方便处理呢?

从生活的常识来看,肯定是B序列更方便处理,因为它有统一的长度,可以不用考虑差异性,50个或者50000个,只是单纯的倍数关系。计算机也和人一样,[[1, 2, 3], [1, 2, 4], [1, 2, 5, 6]]这些数字也是有长有短的,它也希望你能统一成一个长度。

pad_sequences方法就是专门干这个事情,将序列数据传进去后,它会以序列中最长的那一条为标准长度,其他短的数据会在前面补0,这样就让序列长度统一了。

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequencessentences = ["I love my dog","I love my cat","You love my dog!","Do you think my dog is amazing?"
]tokenizer = Tokenizer(num_words=100, oov_token="<OOV>")
tokenizer.fit_on_texts(sentences)
word_index = tokenizer.word_indexsequences = tokenizer.texts_to_sequences(sentences)
padded = pad_sequences(sequences)print(word_index)
print(sequences)
print(padded)

输出

{'<OOV>': 1, 'my': 2, 'love': 3, 'dog': 4, 'i': 5, 'you': 6, 'cat': 7, 'do': 8, 'think': 9, 'is': 10, 'amazing': 11}
[[5, 3, 2, 4], [5, 3, 2, 7], [6, 3, 2, 4], [8, 6, 9, 2, 4, 10, 11]]
[[ 0  0  0  5  3  2  4][ 0  0  0  5  3  2  7][ 0  0  0  6  3  2  4][ 8  6  9  2  4 10 11]]

如果想在句子后而不是句子前补零,只需要将padding参数设置为post

padded = pad_sequences(sequences, padding="post")

如果不希望填充句子的长度根最大长度一致,也可以进行手动设置maxlen属性设置最大单词个数,超过则通过truncating设置为post或者pre,分别代表阶段结尾或开头处的单词

padded = pad_sequences(sequences, padding="post", truncating="post", maxlen=5)

三、打造识别文本情感的模型

数据集介绍

数据集中标题已经被分为[sarcastic]和[no sarcastic]两类,在此基础上训练一个文本分类器,进而判断一段新文本是否具有讽刺意味

地址:https://www.kaggle.com/datasets/rmisra/news-headlines-dataset-for-sarcasm-detection

在这里插入图片描述
1和0,分别代表着是或不是讽刺的;有对应文章标题headline和文本内容aeticle_link

数据格式以json格式进行存储

功能实现

数据集加载
import jsondatastore = []
with open("Sarcasm_Headlines_Dataset.json", 'r') as f:for line in f:item = json.loads(line)datastore.append(item)
sentences = []
labels = []
urls = []
for item in datastore:sentences.append(item["headline"])labels.append(item["is_sarcastic"])urls.append((item['article_link']))
# print(sentences)
# print(labels)
# print(urls)

可以看出一共26709个序列,每个序列有40个token

from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequencestokenizer = Tokenizer(oov_token="<OOV>")
tokenizer.fit_on_texts(sentences)
word_index = tokenizer.word_indexsequences = tokenizer.texts_to_sequences(sentences)
padded = pad_sequences(sequences, padding="post")print(padded[0])
print(padded.shape)
# [  308 15115   679  3337  2298    48   382  2576 15116     6  2577  8434
#      0     0     0     0     0     0     0     0     0     0     0     0
#      0     0     0     0     0     0     0     0     0     0     0     0
#      0     0     0     0]
# (26709, 40)
数据集划分、填充、处理
import tensorflow as tf
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequencesvocab_size = 10000  # 词汇表的大小
embedding_dim = 16  # 每个单词在嵌入空间中的表示维度
max_length = 100  # 填充后的句子长度,表示模型接受的输入序列的最大长度
padding_type = "post"  # 填充类型,表示在填充序列时在句子的哪一端进行填充
trunc_type = "post"  # 截断类型,表示在截断序列时在句子的哪一端进行截断
oov_tok = "<OOV>"
training_size = 20000training_sentences = sentences[0:training_size]
test_sentences = sentences[training_size:]
training_labels = labels[0:training_size]
test_labels = labels[training_size:]# 分词
tokenizer = Tokenizer(num_words=vocab_size, oov_token=oov_tok)
tokenizer.fit_on_texts(training_sentences)
word_index = tokenizer.word_index
# 将训练集句子转换成数字序列,并进行填充
training_sequences = tokenizer.texts_to_sequences(training_sentences)
training_padded = pad_sequences(training_sequences, maxlen=max_length, padding=padding_type, truncating=trunc_type)
# 将测试集句子转换成数字序列,并进行填充
test_sequences = tokenizer.texts_to_sequences(test_sentences)
test_padded = pad_sequences(test_sequences, maxlen=max_length, padding=padding_type, truncating=trunc_type)
# 转换
import numpy as np
training_padded = np.array(training_padded)
training_labels = np.array(training_labels)
test_padded = np.array(test_padded)
test_labels = np.array(test_labels)
模型网络定义和训练
model = tf.keras.Sequential([tf.keras.layers.Embedding(vocab_size, embedding_dim, input_length=max_length),tf.keras.layers.GlobalAveragePooling1D(),tf.keras.layers.Dense(24, activation='relu'),tf.keras.layers.Dense(1, activation='sigmoid')
])
model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])
model.summary()
num_epochs = 30
history = model.fit(training_padded, training_labels, epochs=num_epochs, validation_data=(test_padded, test_labels), verbose=2)
绘图评估
import matplotlib.pyplot as pltdef plot_graphs(history, string):plt.plot(history.history[string])plt.plot(history.history['val_' + string])plt.xlabel("Epochs")plt.ylabel(string)plt.legend([string, 'val_' + string])plt.show()plot_graphs(history, "accuracy")
plot_graphs(history, "loss")

​
在这里插入图片描述

测试
sentence = ["granny starting to fear spiders in the garden might be real","game of thrones season finale showing this sunday night"]
sequences = tokenizer.texts_to_sequences(sentence)
padded = pad_sequences(sequences, maxlen=max_length, padding=padding_type, truncating=trunc_type)
print(model.predict(padded))
#[[9.4739074e-01] [5.3165233e-05]]

四、循环神经网络

此类型神经网络在学习时候,会将数据序列考虑在内,文本生成本质上就是要预测下一个单词

非序列数据是如何转换为序列数据?


一个数值再整个数列的生命中反复出现,这就是循环神经网络的原理,通常一个循环神经网络神经元如下,神经元得到一个输入值,产生一个输出值,除输出外他还会参数一个前馈数值,并传递给下一个神经元

大量神经元加在一起就形成了这个网络,从左到右,将X0输入神经元,会计算出一个结果Y0,同时还会输出一个数值,传递给下一个神经元,然后得到X1以及前一个神经元的前馈数值并计算出Y1,他的输出和X2结合,得到Y2和一个前馈值,在传递给下一个神经元,以此类推,序列被编码到输出中

这种数据的递归,就被称为循环神经网络,随着计算的加深,最先的输入影像会逐渐减小,比如1号位置的数字对于100号位置的数字影响很小,影响虽然是存在的,但是微乎其微,这就是循环神经网络的局限性

关键描述词约接近预测文本,预测就越精确,如下面的词的预测就是,如果只根据最近的单词进行预测,就会漏掉这一线索,结果也就不精确,这部分实现的关键是超越循环神经网络的超短期记忆形成了长短期记忆,这种适用于循环神经网络的算法就叫长短期记忆,简称LSTM

五、长短期记忆网络(LSTM)

句子前文单词可以决定下文的含义和语义,要实现这个目标,就要用到LSTM

如果是下面这一句话,我们是很容易预测到下面的这个单词是sky,因为句子中有很多处符合这个单词的语境,尤其是单词blue

但如果是这样一句话,正确答案就是Gaelic而不是lrish,关键词在lreland,因为这种情况下国家决定语言,但是这个单词在句中的位置非常靠前,所以在使用循环神经网络时候可能很难实现正确的预测

因为循环神经网络如果传输距离很长的话,它上下文之间的联系可能会被大大稀释,这样一来就没办法弄清楚前文单词如何决定整体句意了

LSTM就可以解决这个问题,它引入了一种叫做Cell state的概念,可以跨越多个和时间段保持语境,从而将句子开头的句意带入下文

可以学习到当我们谈论语言的时候,Ireland说的是Gaelic,而且它可以是双向的,句子后面的词也可以为前面的词提供语境


代码说明:首先定义一个LSTM层,这里需要一个参数表示其中隐藏节点的数量,也表示LSTM输入门的维度,如果希望是双向的,则可以使用Bidirectional包裹这个层,实现同时向前和向后巡视句子文本,学习每个句子的最佳参数然后将其合并

当然LSTM层也可以进行堆积,但是要确保所有逐层传递的图层都设置return_sequences=True

六、打造一个会写诗的AI

使用传统爱尔兰歌曲的单词进行训练,得到一个可以写诗的模型,爱尔兰歌曲生成器 Colab → https://goo.gle/3aSTLGx

相关库导入

import tensorflow as tf
from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow.keras.layers import Embedding, LSTM, Dense, Bidirectional
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.models import Sequential
from tensorflow.keras.optimizers import Adam
import numpy as np 
!wget --no-check-certificate \https://storage.googleapis.com/learning-datasets/irish-lyrics-eof.txt \-O /tmp/irish-lyrics-eof.txt

数据集生成

可以将一行文本形成多行文本列表,如知道A后面就是B,知道A、B后面就是C

tokenizer = Tokenizer()
data = open('/tmp/irish-lyrics-eof.txt').read()
corpus = data.lower().split("\n")
tokenizer.fit_on_texts(corpus)
total_words = len(tokenizer.word_index) + 1
print(tokenizer.word_index)
print(total_words)

进行填充等操作,并分割处数据和标签

input_sequences = []
for line in corpus:token_list = tokenizer.texts_to_sequences([line])[0]for i in range(1, len(token_list)):n_gram_sequence = token_list[:i+1]input_sequences.append(n_gram_sequence)# pad sequences 
max_sequence_len = max([len(x) for x in input_sequences])
input_sequences = np.array(pad_sequences(input_sequences, maxlen=max_sequence_len, padding='pre'))# create predictors and label
xs, labels = input_sequences[:,:-1],input_sequences[:,-1]ys = tf.keras.utils.to_categorical(labels, num_classes=total_words)

模型训练

这部分用的lstm,云端是正常能跑通的,但不知本地为何一直报错,可能是我的版本问题

model = Sequential()
model.add(Embedding(total_words, 100, input_length=max_sequence_len-1))
model.add(Bidirectional(LSTM(150)))
model.add(Dense(total_words, activation='softmax'))
adam = Adam(lr=0.01)
model.compile(loss='categorical_crossentropy', optimizer=adam, metrics=['accuracy'])
#earlystop = EarlyStopping(monitor='val_loss', min_delta=0, patience=5, verbose=0, mode='auto')
history = model.fit(xs, ys, epochs=100, verbose=1)
#print model.summary()
print(model)

绘图评估

import matplotlib.pyplot as pltdef plot_graphs(history, string):plt.plot(history.history[string])plt.xlabel("Epochs")plt.ylabel(string)plt.show()

在这里插入图片描述

调用测试

seed_text = "I've got a bad feeling about this"
next_words = 100for _ in range(next_words):token_list = tokenizer.texts_to_sequences([seed_text])[0]token_list = pad_sequences([token_list], maxlen=max_sequence_len-1, padding='pre')predicted = np.argmax(model.predict(token_list), axis=-1)output_word = ""for word, index in tokenizer.word_index.items():if index == predicted:output_word = wordbreakseed_text += " " + output_word
print(seed_text)
'''
I've got a bad feeling about this town my father say you is there i journey your eyes more did sends him fairer than only jenny to hat eight platform tiny name they wind diamond wind sod sod sod change struggle buy beating tie round wind and doesnt wind mythology bride and tree round the tiny dungannon politicians havent james lassies up sheilings dungannon rogue rogue they could not bound be a hobble in the blue town down down the rocky thorn to warm down they ground and bride as tis the wind shines wandered of a call spancil hill li li fairer friend they turning grey
'''

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

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

相关文章

数据分析案例-基于亚马逊智能产品评论的探索性数据分析

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

URL编码算法:解决特殊字符在URL中的烦恼

引言&#xff1a; URL编码算法是一种将URL中的特殊字符转换为特定格式的编码方式。它在网络传输中起到了保护数据安全与完整性的重要作用。本文将深入探讨URL编码算法的优点与缺点&#xff0c;并介绍它在Web开发、网络安全等方面的应用。 URL编码解码 | 一个覆盖广泛主题工具…

JavaWeb学习|i18n

学习材料声明 所有知识点都来自互联网&#xff0c;进行总结和梳理&#xff0c;侵权必删。 引用来源&#xff1a;尚硅谷最新版JavaWeb全套教程,java web零基础入门完整版 i18n 国际化&#xff08;Internationalization&#xff09;指的是同一个网站可以支持多种不同的语言&…

Ubuntu 22 部署Zabbix 6.4

一、安装及配置postgresql sudo apt-get update sudo apt-get install postgresql postgresql-client 修改配置文件&#xff0c;配置远程访问&#xff1a;&#xff08;PostgreSQL安装路径下的data&#xff0c;也是安装时data的默认路径&#xff09;data目录下的 pg_hba.conf …

BN介绍:卷积神经网络中的BatchNorm

一、BN介绍 1.原理 在机器学习中让输入的数据之间相关性越少越好&#xff0c;最好输入的每个样本都是均值为0方差为1。在输入神经网络之前可以对数据进行处理让数据消除共线性&#xff0c;但是这样的话输入层的激活层看到的是一个分布良好的数据&#xff0c;但是较深的激活层…

.NET命令行(CLI)常用命令

本文用于记录了.NET软件开发全生命周期各阶段常用的一些CLI命令&#xff0c;用于开发速查。 .NET命令行&#xff08;CLI&#xff09;常用命令 项目创建&#xff08;1&#xff09;查看本机SDK&#xff08;2&#xff09;查看本机可以使用的.NET版本&#xff08;3&#xff09;生成…

C语言--------数据在内存中的存储

1.整数在内存中的存储 整数在内存是以补码的形式存在的&#xff1b; 整型家族包括char,int ,long long,short类型&#xff1b; 因为char类型是以ASCII值形式存在&#xff0c;所以也是整形家族&#xff1b; 这四种都包括signed,unsigned两种&#xff0c;即有符号和无符号&am…

Python Matplotlib 的学习笔记

Python Matplotlib 的学习笔记 0. Python Matplotlib 简介1. 为什么要用 Matplotlib&#xff1f;2. Matplotlib 基础类详解2-1. Line&#xff08;线&#xff09;2-2. Marker&#xff08;标记&#xff09;2-3. Text&#xff08;文本&#xff09;2-4. Legend&#xff08;图例&…

Python面向对象学习小记

python中的类可以分为经典类和新式类。 类的定义方法&#xff1a; class 类名&#xff1a; pass 类名后面没有小括号&#xff01;&#xff01;&#xff01; 【注意和函数的定义做区分。】 函数的定义&#xff1a; def 函数名(): pass

【Linux】并发解决(上)-中断屏蔽,原子操作

&#x1f525;博客主页&#xff1a;PannLZ &#x1f38b;系列专栏&#xff1a;《Linux系统之路》 &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 文章目录 并发解决1.中断屏蔽2.原子操作2.1整形原子操作2.2位原子操作原子变量使用例子 并发解决…

(力扣)1314.矩阵区域和

给你一个 m x n 的矩阵 mat 和一个整数 k &#xff0c;请你返回一个矩阵 answer &#xff0c;其中每个 answer[i][j] 是所有满足下述条件的元素 mat[r][c] 的和&#xff1a; i - k < r < i k, j - k < c < j k 且(r, c) 在矩阵内。 示例 1&#xff1a; 输入&a…

【运维测试】移动测试自动化知识总结第1篇:移动端测试介绍(md文档已分享)

本系列文章md笔记&#xff08;已分享&#xff09;主要讨论移动测试相关知识。主要知识点包括&#xff1a;移动测试分类及android环境搭建&#xff0c;adb常用命令&#xff0c;appium环境搭建及使用&#xff0c;pytest框架学习&#xff0c;PO模式&#xff0c;数据驱动&#xff0…

随机过程及应用学习笔记(三)几种重要的随机过程

介绍独立过程和独立增量过程。重点介绍两种独立增量过程-—维纳过程和泊松过程。 目录 前言 一、独立过程和独立增量过程 1、独立过程&#xff08;Independent Process&#xff09; 2、独立增量过程&#xff08;Independent Increment Process&#xff09; 二、正态过程&am…

C语言求解猴子分桃子

问题&#xff1a;海滩上有一堆桃子&#xff0c;五只猴子来分。第一只猴子把这堆桃子平均分为五份&#xff0c;多了一个&#xff0c;这只 猴子把多的一个扔入海中&#xff0c;拿走了一份。第二只猴子把剩下的桃子又平均分成五份&#xff0c;又多了 一个&#xff0c;它同样把多的…

【数据结构】图

文章目录 图1.图的两种存储结构2.图的两种遍历方式3.最小生成树的两种算法&#xff08;无向连通图一定有最小生成树&#xff09;4.单源最短路径的两种算法5.多源最短路径 图 1.图的两种存储结构 1. 图这种数据结构相信大家都不陌生&#xff0c;实际上图就是另一种多叉树&…

各指针含义区分

一、char *a P109: (1)(变量)指针变量&#xff1a;指针变量&#xff0c;即指针的定义&#xff1a;用来存放指针的变量。指向的是变量&#xff0c;且可以改变其指向的地址。P104 char *a (2)(变量)指针常量&#xff1a;指针常量&#xff0c;指向的是变量首字节的地址&#xff…

QT 工具栏 状态栏 停靠部件 核心部件

添加/删除工具栏 删除工具栏方法和删除菜单栏方法一样&#xff0c;不过工具栏可以有多个&#xff0c;所以每次右键MainWindow对象&#xff0c;都可以看到添加工具栏的选项。 工具栏添加动作 新添加的QAction对象会在动作编辑器里找到&#xff08;Action Editor&#xff09;&a…

【51单片机】AT24C02(江科大、爱上半导体)

一、AT24C02 1.AT24C02介绍 AT24C02是一种可以实现掉电不丢失的存储器,可用于保存单片机运行时想要永久保存的数据信息 存储介质:E2PROM 通讯接口:12C总线 容量:256字节 2.引脚即应用电路 本开发板AT24C02原理图 12C地址全接地,即全为0 WE接地,没有写使能 SCL接P21 S…

WordPress函数wptexturize的介绍及用法示例,字符串替换为HTML实体

在查看WordPress你好多莉插件时发现代码中使用了wptexturize()函数用来随机输出一句歌词&#xff0c;下面boke112百科就跟大家一起来学习一下WordPress函数wptexturize的介绍及用法示例。 WordPress函数wptexturize介绍 wptexturize( string $text, bool $reset false ): st…

VMware虚拟机网络配置

VMware虚拟机网络配置 桥接模式NAT网络 桥接模式 桥接模式其实就是借助你宿主机上的网卡进行联网和通信&#xff0c;所以相当于虚拟机和宿主机平级&#xff0c;处于同一个网段中。 配置要点&#xff1a; 注意选择正确的宿主机网卡 查看宿主机的网络信息&#xff0c;这些信息指…