自然语言处理:命名实体识别(NER):命名实体识别中的注意力机制_第1页
自然语言处理:命名实体识别(NER):命名实体识别中的注意力机制_第2页
自然语言处理:命名实体识别(NER):命名实体识别中的注意力机制_第3页
自然语言处理:命名实体识别(NER):命名实体识别中的注意力机制_第4页
自然语言处理:命名实体识别(NER):命名实体识别中的注意力机制_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

自然语言处理:命名实体识别(NER):命名实体识别中的注意力机制1绪论1.1命名实体识别(NER)简介命名实体识别(NamedEntityRecognition,简称NER)是自然语言处理(NLP)领域的一个重要任务,旨在从文本中识别出具有特定意义的实体,如人名、地名、组织机构名、时间、货币等。NER是信息抽取、问答系统、机器翻译等高级NLP应用的基础,其准确性和效率直接影响到后续任务的性能。1.1.1原理与方法传统的NER方法基于规则或统计模型,如隐马尔可夫模型(HMM)、条件随机场(CRF)等。近年来,深度学习技术,尤其是基于神经网络的模型,如长短期记忆网络(LSTM)、双向长短期记忆网络(BiLSTM)和Transformer模型,因其强大的特征学习能力和模型泛化能力,在NER任务中取得了显著的成果。1.1.2示例假设我们有以下文本:text="张三于2023年4月1日在北京大学发表了关于自然语言处理的演讲。"使用一个基于BiLSTM-CRF的NER模型,我们可以识别出以下实体:-人名:张三-时间:2023年4月1日-地点:北京大学1.2注意力机制在自然语言处理中的应用注意力机制(AttentionMechanism)最初在计算机视觉领域提出,用于解决卷积神经网络(CNN)在处理图像时的全局信息利用问题。在NLP领域,注意力机制被引入以解决序列模型在处理长序列时的梯度消失问题,以及增强模型对输入序列中关键信息的捕捉能力。1.2.1原理注意力机制允许模型在处理序列时,为序列中的每个位置分配不同的权重,从而在解码时更关注与当前任务相关的信息。在NER中,注意力机制可以帮助模型聚焦于实体周围的上下文信息,提高实体识别的准确性。1.2.2示例在Transformer模型中,多头注意力(Multi-HeadAttention)机制是其核心组成部分之一。以下是一个多头注意力机制的代码示例:importtorch

importtorch.nnasnn

classMultiHeadAttention(nn.Module):

def__init__(self,embed_dim,num_heads):

super(MultiHeadAttention,self).__init__()

self.embed_dim=embed_dim

self.num_heads=num_heads

self.head_dim=embed_dim//num_heads

assertself.head_dim*num_heads==self.embed_dim,"Embeddingdimensionmustbedivisiblebynumberofheads"

self.query_proj=nn.Linear(embed_dim,embed_dim)

self.key_proj=nn.Linear(embed_dim,embed_dim)

self.value_proj=nn.Linear(embed_dim,embed_dim)

self.out_proj=nn.Linear(embed_dim,embed_dim)

defforward(self,query,key,value,mask=None):

batch_size=query.size(0)

#Projectthequery,keyandvalue

query=self.query_proj(query)

key=self.key_proj(key)

value=self.value_proj(value)

#Splitintomultipleheads

query=query.view(batch_size,-1,self.num_heads,self.head_dim).transpose(1,2)

key=key.view(batch_size,-1,self.num_heads,self.head_dim).transpose(1,2)

value=value.view(batch_size,-1,self.num_heads,self.head_dim).transpose(1,2)

#Computeattentionscores

scores=torch.matmul(query,key.transpose(-2,-1))/torch.sqrt(torch.tensor(self.head_dim,dtype=torch.float))

#Applymaskifprovided

ifmaskisnotNone:

scores=scores.masked_fill(mask==0,-1e9)

#Applysoftmaxtogetattentionweights

attn_weights=torch.softmax(scores,dim=-1)

#Computeweightedsumofvalues

attn_output=torch.matmul(attn_weights,value)

#Concatenateheadsandproject

attn_output=attn_output.transpose(1,2).contiguous().view(batch_size,-1,self.embed_dim)

attn_output=self.out_proj(attn_output)

returnattn_output,attn_weights在这个例子中,我们定义了一个多头注意力模块,它接受查询(query)、键(key)和值(value)作为输入,并输出注意力加权后的值和注意力权重。1.3NER中引入注意力机制的必要性在NER任务中,实体周围的上下文信息对于正确识别实体至关重要。例如,在句子“张三在清华大学工作”中,正确识别“张三”和“清华大学”为实体,需要模型理解“在”字连接的两个实体之间的关系。传统的序列模型,如LSTM和GRU,虽然能够处理序列数据,但在长序列中,它们可能无法有效地捕捉到远距离的上下文信息。注意力机制的引入,使得模型能够直接关注到与实体识别最相关的上下文信息,从而提高NER的性能。1.3.1实例分析考虑以下句子:sentence="李四于2022年毕业于北京大学,后加入阿里巴巴集团。"在这个句子中,实体“李四”、“2022年”、“北京大学”和“阿里巴巴集团”之间的关系对于正确识别它们的类型至关重要。使用注意力机制,模型可以为“毕业于”和“加入”这两个词分配较高的权重,因为它们提供了实体类型的重要线索。这有助于模型更准确地识别“李四”为人物,“2022年”为时间,“北京大学”和“阿里巴巴集团”为组织机构。1.3.2总结通过在NER模型中引入注意力机制,我们可以显著提高模型对实体上下文信息的利用效率,从而提高实体识别的准确性。无论是基于LSTM的模型还是基于Transformer的模型,注意力机制都已成为提升NER性能的关键技术之一。2注意力机制基础2.1注意力机制的基本概念注意力机制(AttentionMechanism)是深度学习领域中的一种技术,最初在机器翻译任务中被提出,旨在解决序列到序列(Seq2Seq)模型中长序列信息处理的问题。在自然语言处理(NLP)任务中,如命名实体识别(NER),注意力机制能够帮助模型聚焦于输入序列中与当前任务最相关的部分,从而提高模型的性能和解释性。2.1.1举例说明假设我们有一个句子:“张三在2022年1月1日去了北京的天安门广场。”在命名实体识别任务中,模型需要识别出“张三”、“2022年1月1日”和“北京的天安门广场”作为不同的实体。注意力机制可以帮助模型在处理每个词时,关注到与该词相关的上下文信息,从而更准确地识别实体。2.2注意力机制的类型注意力机制根据其工作方式可以分为多种类型,包括:全局注意力(GlobalAttention):在整个输入序列上计算注意力权重,使得模型在生成每个输出时都能考虑所有输入信息。局部注意力(LocalAttention):只考虑输入序列中的一部分,通常是在当前输出位置附近的输入信息。自注意力(Self-Attention):输入序列中的每个位置都与序列中的其他位置进行交互,计算注意力权重,这种机制在Transformer模型中被广泛应用。2.2.1代码示例:自注意力机制importtorch

importtorch.nnasnn

classSelfAttention(nn.Module):

def__init__(self,embed_size,heads):

super(SelfAttention,self).__init__()

self.embed_size=embed_size

self.heads=heads

self.head_dim=embed_size//heads

assert(self.head_dim*heads==embed_size),"Embedsizeneedstobedivisiblebyheads"

self.values=nn.Linear(self.head_dim,self.head_dim,bias=False)

self.keys=nn.Linear(self.head_dim,self.head_dim,bias=False)

self.queries=nn.Linear(self.head_dim,self.head_dim,bias=False)

self.fc_out=nn.Linear(heads*self.head_dim,embed_size)

defforward(self,values,keys,query,mask):

N=query.shape[0]

value_len,key_len,query_len=values.shape[1],keys.shape[1],query.shape[1]

#Splittheembeddingintoself.headsdifferentpieces

values=values.reshape(N,value_len,self.heads,self.head_dim)

keys=keys.reshape(N,key_len,self.heads,self.head_dim)

queries=query.reshape(N,query_len,self.heads,self.head_dim)

values=self.values(values)

keys=self.keys(keys)

queries=self.queries(queries)

energy=torch.einsum("nqhd,nkhd->nhqk",[queries,keys])

#queriesshape:(N,query_len,heads,heads_dim),

#keysshape:(N,key_len,heads,heads_dim)

#energy:(N,heads,query_len,key_len)

ifmaskisnotNone:

energy=energy.masked_fill(mask==0,float("-1e20"))

attention=torch.softmax(energy/(self.embed_size**(1/2)),dim=3)

out=torch.einsum("nhql,nlhd->nqhd",[attention,values]).reshape(

N,query_len,self.heads*self.head_dim

)

out=self.fc_out(out)

returnout2.3注意力机制的计算原理注意力机制的核心计算原理是通过计算查询(Query)、键(Key)和值(Value)之间的相似度来分配注意力权重。具体步骤如下:查询、键和值的生成:首先,将输入序列通过线性变换生成查询、键和值向量。注意力权重计算:计算查询向量与所有键向量之间的相似度,通常使用点积(DotProduct)或加性(Additive)方法。权重归一化:使用softmax函数对计算出的注意力权重进行归一化,确保权重之和为1。加权求和:将归一化后的注意力权重与值向量相乘,然后对所有值向量进行加权求和,得到最终的注意力输出。2.3.1代码示例:点积注意力计算defscaled_dot_product_attention(query,key,value,mask=None):

d_k=query.size()[-1]

scores=torch.matmul(query,key.transpose(-2,-1))/math.sqrt(d_k)

ifmaskisnotNone:

scores=scores.masked_fill(mask==0,-1e9)

attention_weights=F.softmax(scores,dim=-1)

output=torch.matmul(attention_weights,value)

returnoutput,attention_weights通过上述代码,我们可以看到点积注意力的计算过程,其中query、key和value分别代表查询、键和值向量,mask用于屏蔽不需要关注的部分。最终,通过点积和softmax函数计算出注意力权重,并与值向量相乘得到注意力输出。通过理解注意力机制的基础概念、类型和计算原理,我们可以更好地在自然语言处理任务中,如命名实体识别,应用这一机制,以提高模型的性能和理解能力。3自然语言处理:命名实体识别(NER)中的注意力机制3.1NER与注意力机制的结合3.1.1基于注意力机制的NER模型架构在自然语言处理中,命名实体识别(NER)是一项关键任务,旨在从文本中识别出人名、地名、组织名等特定实体。传统的NER模型,如基于规则的方法、隐马尔可夫模型(HMM)、条件随机场(CRF)等,虽然在特定领域表现良好,但在处理长距离依赖和复杂语境时存在局限性。近年来,深度学习技术,尤其是基于注意力机制的模型,为NER带来了显著的性能提升。3.1.1.1注意力机制的引入注意力机制最初在机器翻译任务中被提出,其核心思想是让模型在处理序列数据时能够关注到输入序列中最重要的部分。在NER中,注意力机制可以帮助模型聚焦于与实体识别最相关的上下文信息,从而提高识别的准确性。3.1.1.2模型架构示例一个典型的基于注意力机制的NER模型架构可能包括以下组件:双向LSTM(LongShort-TermMemory)层:用于捕捉序列中的上下文信息。注意力层:基于双向LSTM的输出,计算每个时间步的注意力权重,以突出重要的上下文信息。CRF层:用于解码,确保实体标签的连贯性。importtorch

importtorch.nnasnn

importtorch.nn.functionalasF

classAttentionNER(nn.Module):

def__init__(self,vocab_size,embedding_dim,hidden_dim,num_layers,num_classes):

super(AttentionNER,self).__init__()

self.embedding=nn.Embedding(vocab_size,embedding_dim)

self.lstm=nn.LSTM(embedding_dim,hidden_dim,num_layers=num_layers,bidirectional=True)

self.attention=nn.Linear(hidden_dim*2,1)

self.fc=nn.Linear(hidden_dim*2,num_classes)

self.crf=CRF(num_classes)

defforward(self,x):

embedded=self.embedding(x)

lstm_out,_=self.lstm(embedded)

attention_weights=F.softmax(self.attention(lstm_out).squeeze(2),dim=1)

attention_applied=torch.bmm(attention_weights.unsqueeze(1),lstm_out.transpose(1,2))

attention_applied=attention_applied.squeeze(1)

out=self.fc(attention_applied)

returnout

#假设的模型参数

vocab_size=10000

embedding_dim=100

hidden_dim=128

num_layers=2

num_classes=5#包括O标签和4种实体标签

#创建模型实例

model=AttentionNER(vocab_size,embedding_dim,hidden_dim,num_layers,num_classes)3.1.2注意力机制在NER中的作用注意力机制在NER中的作用主要体现在以下几点:上下文信息的强化:通过计算注意力权重,模型可以识别哪些词对实体识别至关重要,从而在预测实体标签时给予这些词更多的权重。长距离依赖的处理:在处理长句子时,注意力机制能够帮助模型克服LSTM等循环神经网络在长距离依赖上的不足,确保模型能够考虑到整个句子的信息。模型解释性:注意力权重可以被可视化,帮助我们理解模型在识别实体时的决策过程,增加了模型的可解释性。3.1.3案例分析:注意力机制提升NER性能3.1.3.1数据样例假设我们有以下文本数据样例:"张三在纽约的帝国大厦工作,他是ABC公司的CEO。"3.1.3.2实体标签对于上述文本,实体标签可能如下:B-PER,I-PER,O,B-LOC,I-LOC,O,O,O,B-ORG,I-ORG,O,O,O,O,O其中,B-表示实体的开始,I-表示实体的内部,O表示非实体。3.1.3.3模型训练与评估在训练模型时,我们使用包含实体标签的标注数据集。模型通过最小化预测标签与真实标签之间的损失函数(如交叉熵损失)来学习参数。评估模型时,我们通常使用准确率、召回率和F1分数等指标。#假设的训练数据

train_data=[

("张三在纽约的帝国大厦工作,他是ABC公司的CEO。",[0,1,2,3,4,2,3,2,5,6,2,2,2,2,2]),

#更多训练数据...

]

#模型训练过程(简化版)

optimizer=torch.optim.Adam(model.parameters(),lr=0.001)

loss_function=nn.CrossEntropyLoss()

forepochinrange(num_epochs):

forsentence,tagsintrain_data:

model.zero_grad()

sentence_tensor=torch.tensor(sentence,dtype=torch.long)

tags_tensor=torch.tensor(tags,dtype=torch.long)

output=model(sentence_tensor)

loss=loss_function(output,tags_tensor)

loss.backward()

optimizer.step()3.1.3.4性能提升分析通过引入注意力机制,模型在处理复杂语境和长距离依赖时表现更佳,能够更准确地识别实体边界。此外,注意力机制还能够帮助模型在处理同形异义词时做出更合理的判断,因为模型会根据上下文自动调整注意力权重。3.2总结通过上述分析和示例,我们可以看到注意力机制在NER任务中的重要性和有效性。它不仅提高了模型的性能,还增加了模型的可解释性,是现代NER模型中不可或缺的组成部分。未来的研究可能会探索更复杂的注意力机制,以进一步提升NER的准确性和效率。4训练与优化4.1NER模型的训练流程在自然语言处理中,命名实体识别(NER)是一项关键任务,用于识别文本中的实体,如人名、地名、组织名等。注意力机制在NER模型中扮演着重要角色,它帮助模型聚焦于输入序列中与当前任务最相关的部分。下面,我们将详细探讨NER模型结合注意力机制的训练流程。4.1.1数据准备NER任务通常需要一个标注过的数据集,其中每个词都被标记为其所属的实体类型或非实体类型。例如,使用CoNLL-2003数据集,每个词都有一个标签,如B-PER(表示人名的开始)、I-PER(表示人名的内部)、B-LOC(表示地名的开始)等。4.1.2模型构建NER模型可以基于多种架构,如循环神经网络(RNN)、长短时记忆网络(LSTM)、门控循环单元(GRU)或更现代的Transformer架构。注意力机制可以被添加到这些架构中,以增强模型的性能。例如,在Transformer中,多头注意力机制允许模型从不同的表示子空间中学习注意力分布。4.1.2.1示例代码:基于Transformer的NER模型importtorch

fromtorchimportnn

fromtransformersimportBertModel,BertTokenizer

classBertForNER(nn.Module):

def__init__(self,num_labels):

super(BertForNER,self).__init__()

self.bert=BertModel.from_pretrained('bert-base-uncased')

self.dropout=nn.Dropout(0.3)

self.classifier=nn.Linear(self.bert.config.hidden_size,num_labels)

defforward(self,input_ids,attention_mask):

outputs=self.bert(input_ids,attention_mask=attention_mask)

sequence_output=outputs[0]

sequence_output=self.dropout(sequence_output)

logits=self.classifier(sequence_output)

returnlogits4.1.3训练过程初始化模型:加载预训练的BERT模型,并在其上添加一个分类层。数据加载:使用DataLoader从数据集中加载批次数据。前向传播:将输入词的ID和注意力掩码传递给模型,获取输出。损失计算:使用交叉熵损失函数计算模型预测与真实标签之间的差异。反向传播:根据损失函数的梯度更新模型参数。优化器更新:使用如AdamW的优化器更新模型权重。评估:在验证集上评估模型性能,如准确率、召回率和F1分数。4.1.3.1示例代码:模型训练fromtorch.utils.dataimportDataLoader

fromtransformersimportAdamW

fromsklearn.metricsimportf1_score

deftrain(model,dataloader,optimizer,device):

model.train()

forbatchindataloader:

input_ids=batch['input_ids'].to(device)

attention_mask=batch['attention_mask'].to(device)

labels=batch['labels'].to(device)

optimizer.zero_grad()

outputs=model(input_ids,attention_mask)

loss=nn.CrossEntropyLoss()(outputs.view(-1,num_labels),labels.view(-1))

loss.backward()

optimizer.step()

defevaluate(model,dataloader,device):

model.eval()

y_true,y_pred=[],[]

withtorch.no_grad():

forbatchindataloader:

input_ids=batch['input_ids'].to(device)

attention_mask=batch['attention_mask'].to(device)

labels=batch['labels'].to(device)

outputs=model(input_ids,attention_mask)

_,predicted=torch.max(outputs.data,1)

y_true.extend(labels.view(-1).tolist())

y_pred.extend(predicted.view(-1).tolist())

returnf1_score(y_true,y_pred,average='weighted')4.2注意力机制参数的优化注意力机制的参数优化是NER模型训练中的关键步骤。优化的目标是调整权重,使得模型能够更准确地关注到输入序列中与实体识别最相关的部分。4.2.1优化策略学习率调整:使用学习率调度器,如ReduceLROnPlateau,根据验证集上的性能动态调整学习率。正则化:应用权重衰减(L2正则化)以防止过拟合。梯度裁剪:限制梯度的大小,避免梯度爆炸。4.2.1.1示例代码:优化器和学习率调度器optimizer=AdamW(model.parameters(),lr=5e-5,weight_decay=0.01)

scheduler=torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer,mode='max',factor=0.5,patience=2)4.3避免过拟合的策略过拟合是机器学习模型训练中常见的问题,特别是在NER这样的序列标注任务中。以下是一些避免过拟合的策略:4.3.1Dropout在模型中添加Dropout层,随机丢弃一部分神经元的输出,以减少模型的复杂度。4.3.2早停法(EarlyStopping)在验证集上监控模型性能,当性能停止提升时,提前终止训练。4.3.3数据增强通过添加噪声、同义词替换或使用数据生成技术来增加训练数据的多样性。4.3.4使用更大的数据集增加训练数据量可以提高模型的泛化能力,减少过拟合的风险。4.3.5集成学习结合多个模型的预测,如使用不同的初始化或架构,可以提高模型的稳定性和准确性。4.3.5.1示例代码:早停法fromtorch.utils.dataimportDataset

classEarlyStopping:

def__init__(self,patience=7,verbose=False,delta=0):

self.patience=patience

self.verbose=verbose

self.counter=0

self.best_score=None

self.early_stop=False

self.val_loss_min=np.Inf

self.delta=delta

def__call__(self,val_loss,model):

score=-val_loss

ifself.best_scoreisNone:

self.best_score=score

self.save_checkpoint(val_loss,model)

elifscore<self.best_score+self.delta:

self.counter+=1

print(f'EarlyStoppingcounter:{self.counter}outof{self.patience}')

ifself.counter>=self.patience:

self.early_stop=True

else:

self.best_score=score

self.save_checkpoint(val_loss,model)

self.counter=0

defsave_checkpoint(self,val_loss,model):

ifself.verbose:

print(f'Validationlossdecreased({self.val_loss_min:.6f}-->{val_loss:.6f}).Savingmodel...')

torch.save(model.state_dict(),'checkpoint.pt')

self.val_loss_min=val_loss通过上述步骤,我们可以构建和优化一个结合注意力机制的NER模型,有效地识别文本中的命名实体,同时避免过拟合,提高模型的泛化能力。5实战演练5.1数据预处理与特征工程在进行命名实体识别(NER)任务之前,数据预处理和特征工程是至关重要的步骤。这包括文本清洗、分词、词性标注、构建词汇表以及将文本转换为模型可以理解的数值表示。5.1.1文本清洗文本清洗涉及去除文本中的噪声,如HTML标签、特殊字符和数字,保留纯文本信息。5.1.2分词与词性标注使用分词工具如jieba对中文文本进行分词,并使用词性标注工具如NLTK或StanfordNLP对英文文本进行词性标注,这有助于模型理解每个词的上下文。5.1.3构建词汇表从训练数据中提取所有唯一的词,构建词汇表,为每个词分配一个唯一的ID,用于后续的词嵌入。5.1.4文本向量化将文本转换为数值表示,常见的方法有:-词嵌入:如Word2Vec、GloVe或BERT的词向量。-字符嵌入:对于处理未登录词或生僻词非常有效。5.1.5代码示例:使用jieba进行中文分词importjieba

#示例文本

text="自然语言处理中的命名实体识别非常重要。"

#分词

words=jieba.lcut(text)

#输出分词结果

print(words)5.1.6代码示例:使用NLTK进行英文词性标注importnltk

#示例文本

text="NaturallanguageprocessingiscrucialforNER."

#分词

tokens=nltk.word_tokenize(text)

#词性标注

pos_tags=nltk.pos_tag(tokens)

#输出词性标注结果

print(pos_tags)5.2模型实现与代码详解在NER任务中,注意力机制可以帮助模型聚焦于输入序列中与当前任务最相关的部分,从而提高模型的性能。我们将使用Transformer模型,具体是BERT,来实现带有注意力机制的NER模型。5.2.1BERT模型BERT(BidirectionalEncoderRepresentationsfromTransformers)是一个基于Transformer的预训练模型,它在多种NLP任务上取得了显著的成果。5.2.2注意力机制注意力机制允许模型在处理序列数据时,为不同的输入位置分配不同的权重,从而更好地捕捉上下文信息。5.2.3代码示例:使用HuggingFace的Transformers库实现BERT模型的NERfromtransformersimportBertForTokenClassification,BertTokenizer,Trainer,TrainingArguments

fromdatasetsimportload_dataset

#加载数据集

dataset=load_dataset("conll2003")

#加载预训练的BERT模型和分词器

model=BertForTokenClassification.from_pretrained("bert-base-cased",num_labels=9)

tokenizer=BertTokenizer.from_pretrained("bert-base-cased")

#准备训练参数

training_args=TrainingArguments(

output_dir='./results',#输出目录

num_train_epochs=3,#总的训练轮数

per_device_train_batch_size=16,#每个GPU的训练批次大小

per_device_eval_batch_size=64,#每个GPU的评估批次大小

warmup_steps=500,#预热步数

weight_decay=0.01,#权重衰减

logging_dir='./logs',#日志目录

)

#创建Trainer实例

trainer=Trainer(

model=model,#要训练的模型

args=training_args,#训练参数

train_dataset=dataset['train'],#训练数据集

eval_dataset=dataset['validation'],#验证数据集

)

#开始训练

trainer.train()5.2.4代码解释上述代码首先加载了conll2003数据集,这是一个广泛使用的NER数据集。然后,从HuggingFace的模型库中加载了预训练的BERT模型和相应的分词器。TrainingArguments用于设置训练的超参数,如训练轮数、批次大小等。最后,创建了一个Trainer实例,并调用其train方法开始训练

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论