国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁 > news >正文

做網(wǎng)站需要什么技術(shù)搜索關(guān)鍵詞站長工具

做網(wǎng)站需要什么技術(shù),搜索關(guān)鍵詞站長工具,建網(wǎng)站要多少錢一年,電影網(wǎng)站空間配置文章目錄 概述原理介紹BERT模型架構(gòu)任務(wù)1 Masked LM(MLM)任務(wù)2 Next Sentence Prediction (NSP)模型輸入下游任務(wù)微調(diào)GLUE數(shù)據(jù)集SQuAD v1.1 和 v2.0NER 情感分類實(shí)戰(zhàn)IMDB影評情感數(shù)據(jù)集數(shù)據(jù)集構(gòu)建模型構(gòu)建 核心代碼超參數(shù)設(shè)置訓(xùn)練結(jié)果注意事項(xiàng) 小結(jié) 本文…

文章目錄

  • 概述
  • 原理介紹
    • BERT模型架構(gòu)
    • 任務(wù)1 Masked LM(MLM)
    • 任務(wù)2 Next Sentence Prediction (NSP)
    • 模型輸入
    • 下游任務(wù)微調(diào)
    • GLUE數(shù)據(jù)集
    • SQuAD v1.1 和 v2.0
    • NER
  • 情感分類實(shí)戰(zhàn)
    • IMDB影評情感數(shù)據(jù)集
    • 數(shù)據(jù)集構(gòu)建
    • 模型構(gòu)建
  • 核心代碼
    • 超參數(shù)設(shè)置
    • 訓(xùn)練結(jié)果
    • 注意事項(xiàng)
  • 小結(jié)

本文涉及的源碼可從BERT論文解讀及情感分類實(shí)戰(zhàn)該文章下方附件獲取

概述

本文將先介紹BERT架構(gòu)和技術(shù)細(xì)節(jié),然后介紹一個(gè)使用IMDB公開數(shù)據(jù)集情感分類的完整實(shí)戰(zhàn)(包含數(shù)據(jù)集構(gòu)建、模型訓(xùn)練微調(diào)、模型評估)。

IMDB數(shù)據(jù)集分為25000條訓(xùn)練集和25000條測試集,是情感分類中的經(jīng)典公開數(shù)據(jù)集,這里使用BERT模型進(jìn)行情感分類,測試集準(zhǔn)確率超過93%。

BERT(Bidirectional Encoder Representations from Transformers)是一種基于Transformer架構(gòu)的雙向編碼器語言模型,它在自然語言處理(NLP)領(lǐng)域取得了顯著的成果。以下是BERT的架構(gòu)和技術(shù)細(xì)節(jié),以及使用BERT在IMDB公開數(shù)據(jù)集上進(jìn)行情感分類的實(shí)戰(zhàn)介紹。

  • BERT架構(gòu)和技術(shù)細(xì)節(jié)
  1. 雙向編碼器:BERT模型通過聯(lián)合考慮所有層中的左側(cè)和右側(cè)上下文來預(yù)訓(xùn)練深度雙向表示,這使得BERT能夠在預(yù)訓(xùn)練階段捕獲更豐富的語言特征。
  2. 預(yù)訓(xùn)練任務(wù)
    • 掩碼語言模型(MLM):BERT隨機(jī)掩蔽詞元并使用來自雙向上下文的詞元以自監(jiān)督的方式預(yù)測掩蔽詞元。在預(yù)訓(xùn)練任務(wù)中,BERT將隨機(jī)選擇15%的詞元作為預(yù)測的掩蔽詞元,其中80%的時(shí)間用特殊的<MASK>詞元替換,10%的時(shí)間替換為隨機(jī)詞元,剩下的10%保持不變。
    • 下一句預(yù)測(NSP):為了幫助理解兩個(gè)文本序列之間的關(guān)系,BERT在預(yù)訓(xùn)練中考慮了一個(gè)二元分類任務(wù)——下一句預(yù)測。在生成句子對時(shí),有一半的時(shí)間它們確實(shí)是連續(xù)的句子,另一半的時(shí)間第二個(gè)句子是從語料庫中隨機(jī)抽取的。
  3. 模型微調(diào):預(yù)訓(xùn)練的BERT模型可以通過添加少量額外的輸出層來微調(diào),從而適應(yīng)廣泛的任務(wù),如問答和語言推斷,而無需對模型架構(gòu)進(jìn)行大量特定任務(wù)的修改。
  • 使用BERT在IMDB數(shù)據(jù)集上進(jìn)行情感分類的實(shí)戰(zhàn)
  1. 數(shù)據(jù)集:IMDB公開數(shù)據(jù)集分為25000條訓(xùn)練集和25000條測試集,用于情感分類任務(wù)。
  2. 模型訓(xùn)練與微調(diào)
    • 加載預(yù)訓(xùn)練的BERT模型。
    • 對原始數(shù)據(jù)進(jìn)行預(yù)處理,使其符合BERT模型的輸入要求。
    • 在訓(xùn)練集上訓(xùn)練BERT模型,進(jìn)行微調(diào)以適應(yīng)情感分類任務(wù)。
  3. 模型評估
    • 在測試集上評估模型的性能,計(jì)算準(zhǔn)確率等指標(biāo)。
    • 報(bào)告測試集準(zhǔn)確率超過93%的結(jié)果。

BERT模型在多個(gè)自然語言處理任務(wù)上取得了新的最先進(jìn)結(jié)果,包括情感分類任務(wù)。使用BERT模型進(jìn)行情感分類能夠取得較好的效果,尤其是在擁有足夠數(shù)據(jù)量和計(jì)算資源的情況下。

原理介紹

BERT模型架構(gòu)

在這里插入圖片描述

BERT模型就是transformer的encoder堆疊而成,只是訓(xùn)練方式是有所講究。
BERT能夠在下游任務(wù)微調(diào),模型結(jié)構(gòu)也只需要改變輸出層即可方便地適配下游任務(wù)。
[CLS]是添加在每個(gè)輸入示例前面的一個(gè)特殊符號(hào),用于整體信息的表示
[SEP]是一個(gè)特殊的分隔符標(biāo)記(例如分隔問題/答案)

BERT不使用傳統(tǒng)的從左到右或從右到左的語言模型來預(yù)訓(xùn)練。相反,是使用兩個(gè)無監(jiān)督任務(wù)預(yù)訓(xùn)練BERT。

任務(wù)1 Masked LM(MLM)

直觀地說,我們有理由相信深度雙向模型嚴(yán)格地比從左到右模型或從左到左模型和從右到左模型的簡單結(jié)合更強(qiáng)大。不幸的是,標(biāo)準(zhǔn)條件語言模型只能從左到右或從右到左進(jìn)行訓(xùn)練,因?yàn)殡p向條件反射允許每個(gè)單詞間接地“看到自己”,并且該模型可以在多層上下文中預(yù)測目標(biāo)單詞。

為了訓(xùn)練深度雙向表示,只需隨機(jī)屏蔽一定百分比的輸入令牌,然后預(yù)測那些屏蔽的令牌。文章將此過程稱為“masked LM”(MLM)。在這種情況下,被屏蔽的單詞的最終隱藏向量被饋送到詞匯表上的輸出softmax中,然后得出預(yù)測。

文章隨機(jī)屏蔽每個(gè)序列中15%的單詞。然后只預(yù)測被屏蔽的單詞。

盡管這能夠獲得雙向預(yù)訓(xùn)練模型,但缺點(diǎn)是在預(yù)訓(xùn)練和微調(diào)之間造成了不匹配,因?yàn)閇MASK]在微調(diào)過程中不會(huì)出現(xiàn)。為了緩解這種情況,我們并不總是用實(shí)際的[MASK]替換“屏蔽”單詞。訓(xùn)練數(shù)據(jù)生成器隨機(jī)選擇15%的單詞用于預(yù)測。在這些單詞中,使用
(1)80%概率的替換為[MASK],即需要進(jìn)行預(yù)測。 這是最常見的掩蓋策略,模型需要學(xué)習(xí)根據(jù)上下文來預(yù)測原本的詞匯,這樣的訓(xùn)練方式使得模型能夠更好地理解詞匯在不同上下文中的含義。
(2)10%概率的替換為隨機(jī)單詞。 這種策略增加了訓(xùn)練數(shù)據(jù)的多樣性,迫使模型不僅僅依賴于特定的掩蓋詞匯來做出預(yù)測。這種隨機(jī)性有助于模型學(xué)習(xí)到更加魯棒的上下文表示,因?yàn)樗荒芎唵蔚赜洃浕蛞蕾囉谔囟ǖ难谏w詞匯。
(3)10%概率單詞不變。 這種策略保留了原始詞匯,不進(jìn)行掩蓋,這有助于模型學(xué)習(xí)到詞匯本身的表示,同時(shí)也為模型提供了一些直接從輸入中學(xué)習(xí)的機(jī)會(huì),而不是完全依賴于上下文推斷。

任務(wù)2 Next Sentence Prediction (NSP)

許多重要的下游任務(wù),如問答(QA)和自然語言推理(NLI),都是基于理解兩句之間的關(guān)系,而語言建模并不能直接捕捉到這一點(diǎn)。為了訓(xùn)練一個(gè)理解句子關(guān)系的模型,文章讓模型在下一個(gè)句子預(yù)測任務(wù)上進(jìn)行預(yù)訓(xùn)練,該任務(wù)可以從任何單語語料庫中輕松生成。

具體而言,當(dāng)為每個(gè)預(yù)訓(xùn)練示例選擇句子A和B時(shí),50%的概率B是A后面的下一個(gè)句子(標(biāo)記為Is Next),50%的概率B是來自語料庫的隨機(jī)句子(標(biāo)記為Not Next)。

模型輸入

在這里插入圖片描述

Token Embeddings就是詞的嵌入層表示,只不過句子開頭要加[CLS]不同句子之間要加[SEP]。

[CLS]的用處如下:
句子表示:在預(yù)訓(xùn)練階段,[CLS]標(biāo)記的最終隱藏狀態(tài)(即經(jīng)過Transformer最后一層的輸出)被用作整個(gè)輸入序列的聚合表示(aggregate sequence representation)。這意味著[CLS]的表示捕捉了整個(gè)序列的上下文信息。

分類任務(wù):在微調(diào)階段,尤其是在句子級(jí)別或序列級(jí)別的分類任務(wù)中,[CLS]的最終隱藏狀態(tài)被用來作為分類的輸入特征。例如,在情感分析、自然語言推斷或其他類似的任務(wù)中,[CLS]的輸出向量會(huì)被送入一個(gè)額外的線性層(分類層),然后應(yīng)用softmax函數(shù)來預(yù)測類別。

問答任務(wù):在問答任務(wù)中,[CLS]也可以用來進(jìn)行答案的預(yù)測。例如,在SQuAD問答任務(wù)中,模型會(huì)輸出答案的開始和結(jié)束位置的概率分布,而[CLS]的表示有助于模型理解問題和段落之間的關(guān)系。

[SEP]用處如下:

分隔句子:
當(dāng)BERT處理由多個(gè)句子組成的句子對時(shí)(例如,在問答任務(wù)中的問題和答案),[SEP]標(biāo)記用來明確地分隔兩個(gè)句子。它允許模型區(qū)分序列中的不同部分,尤其是在處理成對的句子時(shí),如在自然語言推斷或問答任務(wù)中。

輸入表示:
在構(gòu)建輸入序列時(shí),句子A(通常是第一個(gè)句子或問題)會(huì)以[CLS]標(biāo)記開始,接著是句子A的單詞,然后是[SEP]標(biāo)記,然后是句子B(通常是第二個(gè)句子或答案)的單詞…
通過在句子之間插入[SEP],模型可以明確地知道序列的結(jié)構(gòu),從而更好地處理和理解輸入的文本。

位置嵌入:
與[CLS]類似,[SEP]也有一個(gè)對應(yīng)的嵌入向量,這個(gè)向量是模型學(xué)習(xí)到的,并且與[CLS]的嵌入向量不同。這個(gè)嵌入向量幫助模型理解[SEP]標(biāo)記在序列中的位置和作用。

注意力機(jī)制:
在Transformer模型的自注意力機(jī)制中,[SEP]標(biāo)記使得模型能夠區(qū)分來自不同句子的標(biāo)記,這對于模型理解句子間關(guān)系的任務(wù)至關(guān)重要。

預(yù)訓(xùn)練和微調(diào):
在預(yù)訓(xùn)練階段,[SEP]幫助模型學(xué)習(xí)如何處理成對的句子,這在NSP(Next Sentence Prediction)任務(wù)中尤為重要。在微調(diào)階段,[SEP]繼續(xù)用于分隔句子對,使得模型能夠適應(yīng)各種需要處理成對文本的下游任務(wù)。

Segment Embeddings 用于標(biāo)記是否屬于同一個(gè)句子。

Position Embeddings 用于標(biāo)記詞的位置信息

下游任務(wù)微調(diào)

BERT能夠輕松地適配下游任務(wù),此時(shí)使用已經(jīng)預(yù)訓(xùn)練好的BERT模型就能花很少的資源和時(shí)間得到很不錯(cuò)地結(jié)果,而不需要我們從頭開始訓(xùn)練BERT模型。

接下來就看一下BERT在不同數(shù)據(jù)集是怎么使用的

GLUE數(shù)據(jù)集

GLUE(General Language Understanding Evaluation)基準(zhǔn)測試是一組不同的自然語言理解任務(wù)的集合。任務(wù)描述如下:

MNLI(Multi-Genre Natural Language Inference):給定一對句子,預(yù)測第二個(gè)句子是否是第一個(gè)句子的蘊(yùn)含、矛盾或中立。
QQP(Quora Question Pairs):判斷Quora上的兩個(gè)問題是否語義等價(jià)。
QNLI(Question Natural Language Inference):基于斯坦福問答數(shù)據(jù)集的二分類任務(wù),判斷問題和句子是否包含正確答案。
SST-2(Stanford Sentiment Treebank):電影評論中句子的情感分類任務(wù)。
CoLA(Corpus of Linguistic Acceptability):判斷英語句子是否語法正確。
STS-B(Semantic Textual Similarity Benchmark):判斷句子對在語義上的相似度。
MRPC(Microsoft Research Paraphrase Corpus):判斷句子對是否語義等價(jià)。
RTE(Recognizing Textual Entailment):文本蘊(yùn)含任務(wù),與MNLI類似,但訓(xùn)練數(shù)據(jù)更少。
WNLI(Winograd NLI):自然語言推理數(shù)據(jù)集,但由于構(gòu)建問題,該數(shù)據(jù)集的結(jié)果未被考慮。

在這里插入圖片描述

對于多個(gè)句子的,輸入形式就是[CLS]+句子1+[SEP]+句子2+…
對于單個(gè)句子的就是[CLS]+句子
然后最后一層輸出的[CLS]用來接個(gè)全連接層進(jìn)行分類,適配不同任務(wù)需要。

SQuAD v1.1 和 v2.0

SQuAD(Stanford Question Answering Dataset)是問答任務(wù)的數(shù)據(jù)集,包括SQuAD v1.1和SQuAD v2.0兩個(gè)版本。任務(wù)描述如下:

SQuAD v1.1:給定一個(gè)問題和一段文本,預(yù)測答案在文本中的位置。
SQuAD v2.0:與SQuAD v1.1類似,但允許問題沒有答案,使問題更具現(xiàn)實(shí)性。

在這里插入圖片描述

對于SQuAD v1.1,輸入格式為[CLS]+問題+[SEP]+段落信息
因?yàn)檫@個(gè)數(shù)據(jù)集就是問題能夠在段落中找到答案,構(gòu)造一個(gè)得分,得分最大的作為預(yù)測值,具體如下:
首先引入S和E兩組可訓(xùn)練參數(shù),用于計(jì)算答案的開始和結(jié)束文章

在這里插入圖片描述

NER

對于命名實(shí)體識(shí)別的任務(wù),BERT實(shí)現(xiàn)起來也是非常簡單。

在這里插入圖片描述

只需要對最后一層的每個(gè)單詞預(yù)測對于的實(shí)體標(biāo)記即可。

情感分類實(shí)戰(zhàn)

IMDB影評情感數(shù)據(jù)集

IMDb Movie Reviews數(shù)據(jù)集是一個(gè)用于情感分析的標(biāo)準(zhǔn)二元分類數(shù)據(jù)集,它包含來自互聯(lián)網(wǎng)電影數(shù)據(jù)庫(Internet Movie Database,簡稱IMDB)的50,000條評論,這些評論被標(biāo)記為正面或負(fù)面。

評論數(shù)量和平衡性:數(shù)據(jù)集包含50,000條評論,其中正面和負(fù)面評論的數(shù)量是相等的,即各占一半。

評分標(biāo)準(zhǔn):評論是基于10分制的評分進(jìn)行分類的。負(fù)面評論的評分在0到4分之間,而正面評論的評分在7到10分之間。

評論選擇:為了確保數(shù)據(jù)集中的評論具有高度的兩極性,選擇了評分差異較大的評論。每部電影最多只包含30條評論。

在這里插入圖片描述

可以看一下榜單,目前在paperwithcode上最高是96.68%,看這模型的名字就不太好惹,但是我們這里簡單使用BERT接個(gè)全連接進(jìn)行二分類,也能達(dá)到93%

數(shù)據(jù)集構(gòu)建

# 定義數(shù)據(jù)集類
class SentenceDataset(Dataset):def __init__(self, sentences, labels, tokenizer, max_length=512):self.sentences = sentencesself.labels = labelsself.tokenizer = tokenizerself.max_length = max_lengthdef __len__(self):return len(self.sentences)def __getitem__(self, idx):# 對文本進(jìn)行編碼encoded = self.tokenizer.encode_plus(self.sentences[idx],add_special_tokens=True,max_length=self.max_length,return_token_type_ids=False,padding='max_length',truncation=True,return_attention_mask=True,return_tensors='pt')# 獲取編碼后的數(shù)據(jù)和注意力掩碼input_ids = encoded['input_ids']attention_mask = encoded['attention_mask']# 返回編碼后的數(shù)據(jù)、注意力掩碼和標(biāo)簽return input_ids, attention_mask, self.labels[idx]

因?yàn)锽ERT是WordPiece嵌入的,所以需要使用他專門的切詞工具才能正常使用,因此在數(shù)據(jù)預(yù)處理的過程中,可以切好詞轉(zhuǎn)化為bert字典中的id,這樣直接喂入bert就能得到我們要的句子bert向量表示了,然后就可以用來分類了。

模型構(gòu)建

使用transformers中預(yù)訓(xùn)練好的BERT模型(bert-base-uncased)
我們可以先來看一下bert模型的輸入輸出:

from transformers import BertTokenizer, BertModel# 初始化分詞器和模型
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')sentences = ["Hello, this is a positive sentence."]# 對句子進(jìn)行編碼
encoded_inputs = tokenizer(sentences, padding=True, truncation=True, return_tensors='pt', max_length=512)
outputs = model(**encoded_inputs)

在這里插入圖片描述

可以看到分詞器的輸出encoded_inputs由三部分組成,維度都是[batch_size, seq_len]

在這里插入圖片描述

可以看到bert模型的輸出為:
outputs[0]是[batch_size, seq_len, hidden_size]
outputs[1]是[batch_size, hidden_size]
outputs[0]就是每個(gè)詞的表示
outputs[1]就是[CLS],可以看成這句話的表示
對于我們的任務(wù),就是實(shí)現(xiàn)情感分類,因此直接使用outputs[1]接全連接就行了

核心代碼

# 定義一個(gè)簡單的全連接層來進(jìn)行二分類
class BertForSequenceClassification(nn.Module):def __init__(self, bert, num_labels=2):super(BertForSequenceClassification, self).__init__()self.bert = bert #BERT模型self.classifier = nn.Linear(bert.config.hidden_size, num_labels)def forward(self, input_ids, attention_mask):outputs = self.bert(input_ids=input_ids, attention_mask=attention_mask)pooled_output = outputs[1]logits = self.classifier(pooled_output)return logits

代碼就是非常簡潔,當(dāng)然,如果想要更好地效果,可以直接加個(gè)LSTM、BiLSTM+Attention等來更好地進(jìn)行語義編碼,操作空間還是很大地。

超參數(shù)設(shè)置

在這里插入圖片描述

batch_size=64 需要50多G顯存才能跑起來,現(xiàn)存小的話可以開4
lr=2e-5就是微調(diào)大模型的常用學(xué)習(xí)率
epoch=2 其實(shí)結(jié)果已經(jīng)很不錯(cuò)了,這可能就是微調(diào)的魅力
num_labels = 2因?yàn)閿?shù)據(jù)集是二分類任務(wù)

因?yàn)檫@個(gè)實(shí)戰(zhàn)是個(gè)簡潔版本,所以超參數(shù)也設(shè)定的很少,代碼也是很簡潔,適合初學(xué)者參考學(xué)習(xí)

訓(xùn)練結(jié)果

在這里插入圖片描述

可以看到測試集的準(zhǔn)確率最高為93.56%
還是很不錯(cuò)的
不過我并沒有固定隨機(jī)種子
可能多跑幾次能夠還有望超越93.56%

注意事項(xiàng)

train_sentences, train_labels = get_data(r'./data/train_data.tsv')
test_sentences, test_labels = get_data(r'./data/test_data.tsv')
# 初始化BERT tokenizer
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
bert_model = BertModel.from_pretrained('bert-base-uncased').to(device)

模型和數(shù)據(jù)附件中都有,運(yùn)行的適合需要將模型和數(shù)據(jù)的路徑修改為自己的路徑

小結(jié)

使用BERT在IMDB數(shù)據(jù)集上進(jìn)行情感分類的實(shí)戰(zhàn)取得了令人滿意的結(jié)果。通過本次實(shí)戰(zhàn),我們深入了解了BERT模型的工作原理和訓(xùn)練方法,并獲得了寶貴的實(shí)踐經(jīng)驗(yàn)。
在這里插入圖片描述

http://aloenet.com.cn/news/32009.html

相關(guān)文章:

  • 高端網(wǎng)站哪個(gè)比較好線上產(chǎn)品推廣方案
  • 針對人群不同 網(wǎng)站做細(xì)分全球疫情最新數(shù)據(jù)
  • 免費(fèi)空間申請網(wǎng)站網(wǎng)絡(luò)營銷在哪里學(xué)比較靠譜
  • 網(wǎng)站備案流程圖上海自動(dòng)seo
  • 2015年做哪個(gè)網(wǎng)站能致富建網(wǎng)站用什么工具
  • 旅游搜索網(wǎng)站開發(fā)百度網(wǎng)站推廣怎么做
  • 鎮(zhèn)江做網(wǎng)站哪家公司好靠網(wǎng)絡(luò)營銷火起來的企業(yè)
  • 方城網(wǎng)站制作網(wǎng)絡(luò)營銷專業(yè)課程
  • 重慶的做網(wǎng)站公司百度風(fēng)云榜小說榜排名
  • 專業(yè)做網(wǎng)站價(jià)格廈門百度關(guān)鍵詞優(yōu)化
  • 網(wǎng)站推廣的技巧和方法企業(yè)網(wǎng)站的網(wǎng)絡(luò)營銷功能
  • 在什么網(wǎng)站做貿(mào)易好最簡短的培訓(xùn)心得
  • 江蘇建設(shè)廳官方網(wǎng)站安全員北京專門做seo
  • 佛山市網(wǎng)站建設(shè)保定網(wǎng)站建設(shè)方案優(yōu)化
  • 一個(gè)域名做多個(gè)網(wǎng)站快速seo優(yōu)化
  • 如何做話費(fèi)卡回收網(wǎng)站開發(fā)網(wǎng)站多少錢
  • 如何增加網(wǎng)站的訪問量手機(jī)網(wǎng)站模板免費(fèi)下載
  • 做網(wǎng)站反復(fù)修改今天熱點(diǎn)新聞事件
  • 有哪些做筆譯的網(wǎng)站怎樣下載優(yōu)化大師
  • 濟(jì)南網(wǎng)站建設(shè)找大標(biāo)深圳網(wǎng)站seo地址
  • 3合一網(wǎng)站怎么做免費(fèi)推廣工具有哪些
  • 網(wǎng)站建設(shè)與規(guī)劃方向免費(fèi)外鏈網(wǎng)盤
  • 彩票網(wǎng)站開發(fā)多少錢四川疫情最新情況
  • 棋牌游戲網(wǎng)站怎么做的seo與sem的區(qū)別
  • 做網(wǎng)站的外包能學(xué)到什么深圳最新政策消息
  • 網(wǎng)站開發(fā)工作需要什么專業(yè)阿森納英超積分
  • 可以做測試的網(wǎng)站廣州軟文推廣公司
  • 靈犀科技 網(wǎng)站建設(shè)深圳廣告公司
  • 百度seo服務(wù)蘇州關(guān)鍵詞優(yōu)化搜索排名
  • 專門做孕嬰用品的網(wǎng)站seo如何去做優(yōu)化