自然語言處理:自動(dòng)摘要:文本預(yù)處理與分詞技術(shù)_第1頁
自然語言處理:自動(dòng)摘要:文本預(yù)處理與分詞技術(shù)_第2頁
自然語言處理:自動(dòng)摘要:文本預(yù)處理與分詞技術(shù)_第3頁
自然語言處理:自動(dòng)摘要:文本預(yù)處理與分詞技術(shù)_第4頁
自然語言處理:自動(dòng)摘要:文本預(yù)處理與分詞技術(shù)_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

自然語言處理:自動(dòng)摘要:文本預(yù)處理與分詞技術(shù)1自然語言處理基礎(chǔ)1.1自然語言處理的定義與應(yīng)用自然語言處理(NaturalLanguageProcessing,NLP)是計(jì)算機(jī)科學(xué)領(lǐng)域與人工智能領(lǐng)域中的一個(gè)重要方向。它研究如何處理和運(yùn)用自然語言,即人類日常使用的語言,如中文、英文等。NLP的目標(biāo)是讓計(jì)算機(jī)能夠理解、解釋和生成人類語言,從而實(shí)現(xiàn)人機(jī)交互的自然化。1.1.1應(yīng)用場景智能客服:自動(dòng)回答用戶問題,提供24小時(shí)不間斷服務(wù)。機(jī)器翻譯:將文本從一種語言自動(dòng)翻譯成另一種語言。情感分析:分析文本中的情感傾向,如正面、負(fù)面或中性。文本分類:將文本歸類到預(yù)定義的類別中,如新聞分類、郵件分類等。信息抽取:從大量文本中自動(dòng)抽取結(jié)構(gòu)化信息,如實(shí)體識(shí)別、關(guān)系抽取等。1.2文本表示方法:從詞袋模型到詞嵌入1.2.1詞袋模型(BagofWords)詞袋模型是一種將文本轉(zhuǎn)換為向量表示的簡單方法。它忽略了詞的順序和語法結(jié)構(gòu),只考慮詞的出現(xiàn)頻率。示例代碼fromsklearn.feature_extraction.textimportCountVectorizer

#示例文本

documents=[

"我愛自然語言處理",

"自然語言處理很有趣",

"我愛有趣的事情"

]

#創(chuàng)建詞袋模型

vectorizer=CountVectorizer()

#將文本轉(zhuǎn)換為詞袋模型

X=vectorizer.fit_transform(documents)

#輸出特征名稱

print(vectorizer.get_feature_names_out())

#輸出詞袋矩陣

print(X.toarray())解釋上述代碼中,我們使用了sklearn庫中的CountVectorizer來創(chuàng)建詞袋模型。documents列表包含了三段文本,vectorizer.fit_transform(documents)將這些文本轉(zhuǎn)換為詞袋矩陣,其中每一行代表一個(gè)文檔,每一列代表一個(gè)詞的出現(xiàn)頻率。1.2.2TF-IDF模型TF-IDF(TermFrequency-InverseDocumentFrequency)是一種更高級(jí)的詞袋模型,它不僅考慮了詞的出現(xiàn)頻率,還考慮了詞在整個(gè)文檔集合中的重要性。示例代碼fromsklearn.feature_extraction.textimportTfidfVectorizer

#示例文本

documents=[

"我愛自然語言處理",

"自然語言處理很有趣",

"我愛有趣的事情"

]

#創(chuàng)建TF-IDF模型

vectorizer=TfidfVectorizer()

#將文本轉(zhuǎn)換為TF-IDF模型

X=vectorizer.fit_transform(documents)

#輸出特征名稱

print(vectorizer.get_feature_names_out())

#輸出TF-IDF矩陣

print(X.toarray())解釋與詞袋模型類似,我們使用TfidfVectorizer來創(chuàng)建TF-IDF模型。X.toarray()輸出的矩陣中,每個(gè)元素表示詞在文檔中的TF-IDF值,該值越高,表示詞在文檔中的重要性越高。1.2.3詞嵌入(WordEmbeddings)詞嵌入是一種將詞轉(zhuǎn)換為連續(xù)向量表示的方法,它能夠捕捉詞之間的語義關(guān)系。常見的詞嵌入模型有Word2Vec和GloVe。Word2Vec示例代碼importgensim

#示例文本

sentences=[

["我","愛","自然","語言","處理"],

["自然","語言","處理","很","有趣"],

["我","愛","有趣","的事情"]

]

#創(chuàng)建Word2Vec模型

model=gensim.models.Word2Vec(sentences,min_count=1)

#輸出詞向量

print(model.wv["自然"])解釋在Word2Vec模型中,我們首先將文本分割成詞的列表,然后使用gensim.models.Word2Vec來訓(xùn)練模型。model.wv["自然"]輸出的是“自然”這個(gè)詞的向量表示。1.2.4總結(jié)文本表示方法是NLP中的基礎(chǔ),從詞袋模型到詞嵌入,我們能夠更深入地理解文本的結(jié)構(gòu)和語義,為后續(xù)的自然語言處理任務(wù)提供有力的支持。在實(shí)際應(yīng)用中,選擇合適的文本表示方法對(duì)于提高模型的性能至關(guān)重要。2文本預(yù)處理技術(shù)2.1文本清洗:去除噪聲數(shù)據(jù)文本清洗是自然語言處理(NLP)中一個(gè)關(guān)鍵的預(yù)處理步驟,旨在去除文本中的噪聲數(shù)據(jù),如HTML標(biāo)簽、特殊字符、數(shù)字、停用詞等,以提高后續(xù)處理的效率和準(zhǔn)確性。2.1.1去除HTML標(biāo)簽在處理從網(wǎng)頁抓取的文本時(shí),HTML標(biāo)簽是常見的噪聲。Python的BeautifulSoup庫可以有效地去除這些標(biāo)簽。frombs4importBeautifulSoup

#示例文本

html_text="<html><body><h1>標(biāo)題</h1><p>這是<em>一段</em>文本。</p></body></html>"

#使用BeautifulSoup去除HTML標(biāo)簽

clean_text=BeautifulSoup(html_text,'html.parser').get_text()

#輸出結(jié)果

print(clean_text)2.1.2去除特殊字符和數(shù)字文本中可能包含各種特殊字符和數(shù)字,這些通常對(duì)NLP任務(wù)沒有幫助??梢允褂谜齽t表達(dá)式來去除它們。importre

#示例文本

text="這是文本,包含特殊字符如@#和數(shù)字1234。"

#使用正則表達(dá)式去除特殊字符和數(shù)字

clean_text=re.sub(r'[\W_]+','',text)

clean_text=re.sub(r'\d+','',clean_text)

#輸出結(jié)果

print(clean_text)2.1.3去除停用詞停用詞是指在信息檢索和文本挖掘中通常被過濾掉的詞,如“的”、“是”、“在”等。去除停用詞可以減少文本的維度,提高處理效率。fromnltk.corpusimportstopwords

fromnltk.tokenizeimportword_tokenize

#示例文本

text="這是文本,包含一些停用詞,如的、是、在。"

#分詞

words=word_tokenize(text)

#定義中文停用詞列表

stop_words=set(stopwords.words('chinese'))

#去除停用詞

filtered_text=[wordforwordinwordsifwordnotinstop_words]

#輸出結(jié)果

print(filtered_text)2.2分詞與詞性標(biāo)注分詞是將連續(xù)的文本切分成一個(gè)個(gè)獨(dú)立的詞語的過程,而詞性標(biāo)注則是為每個(gè)詞語添加語法信息,如名詞、動(dòng)詞等。2.2.1使用jieba進(jìn)行分詞jieba是中文分詞的一個(gè)流行庫,可以高效地進(jìn)行分詞。importjieba

#示例文本

text="自然語言處理技術(shù)在信息檢索中非常重要。"

#使用jieba進(jìn)行分詞

seg_list=jieba.cut(text,cut_all=False)

#輸出分詞結(jié)果

print("".join(seg_list))2.2.2使用NLTK進(jìn)行詞性標(biāo)注NLTK庫提供了詞性標(biāo)注的功能,對(duì)于英文文本非常有效。importnltk

#示例文本

text="Naturallanguageprocessingisimportantininformationretrieval."

#分詞

words=nltk.word_tokenize(text)

#詞性標(biāo)注

pos_tags=nltk.pos_tag(words)

#輸出詞性標(biāo)注結(jié)果

print(pos_tags)2.3命名實(shí)體識(shí)別命名實(shí)體識(shí)別(NER)是識(shí)別文本中具有特定意義的實(shí)體,如人名、地名、組織名等。2.3.1使用Spacy進(jìn)行命名實(shí)體識(shí)別Spacy是一個(gè)強(qiáng)大的NLP庫,支持多種語言的命名實(shí)體識(shí)別。importspacy

#加載中文模型

nlp=spacy.load('zh_core_web_sm')

#示例文本

text="李華在北京大學(xué)工作,他喜歡去上海旅游。"

#使用Spacy進(jìn)行命名實(shí)體識(shí)別

doc=nlp(text)

#輸出命名實(shí)體識(shí)別結(jié)果

forentindoc.ents:

print(ent.text,ent.label_)以上代碼和示例展示了如何使用Python中的不同庫進(jìn)行文本預(yù)處理,包括文本清洗、分詞、詞性標(biāo)注和命名實(shí)體識(shí)別。這些步驟是構(gòu)建自動(dòng)摘要系統(tǒng)或其他NLP應(yīng)用的基礎(chǔ)。3自動(dòng)摘要方法3.1提取式摘要:基于統(tǒng)計(jì)和基于機(jī)器學(xué)習(xí)的方法3.1.1基于統(tǒng)計(jì)的方法提取式摘要基于統(tǒng)計(jì)的方法通常涉及計(jì)算文本中句子的重要性,然后選擇那些最能代表原文的句子作為摘要。這種方法的核心是文本特征的提取和句子評(píng)分。文本特征提取文本特征提取包括詞頻、TF-IDF、詞共現(xiàn)矩陣等。例如,TF-IDF是一種常用的統(tǒng)計(jì)方法,它結(jié)合了詞在文檔中的頻率(TermFrequency,TF)和詞在整個(gè)語料庫中的頻率(InverseDocumentFrequency,IDF)來評(píng)估詞的重要性。句子評(píng)分一旦提取了特征,就可以使用這些特征來評(píng)分句子。一個(gè)簡單的例子是使用詞的TF-IDF值的加權(quán)和作為句子的得分。更復(fù)雜的方法可能包括使用PageRank算法或TextRank算法,這些算法基于圖論來評(píng)估句子的重要性。示例代碼:基于TF-IDF的提取式摘要fromsklearn.feature_extraction.textimportTfidfVectorizer

fromsklearn.metrics.pairwiseimportcosine_similarity

importnltk

fromnltk.corpusimportstopwords

fromnltk.tokenizeimportsent_tokenize,word_tokenize

#示例文本

text="自然語言處理是計(jì)算機(jī)科學(xué)領(lǐng)域與人工智能領(lǐng)域中的一個(gè)重要方向。它研究能實(shí)現(xiàn)人與計(jì)算機(jī)之間用自然語言進(jìn)行有效通信的各種理論和方法。自然語言處理是一門融語言學(xué)、計(jì)算機(jī)科學(xué)、數(shù)學(xué)于一體的科學(xué)。"

#分句

sentences=sent_tokenize(text)

#去除停用詞

stop_words=set(stopwords.words('chinese'))

words=word_tokenize(text)

filtered_text="".join([wordforwordinwordsifwordnotinstop_words])

#TF-IDF向量化

vectorizer=TfidfVectorizer()

tfidf_matrix=vectorizer.fit_transform(sentences)

#計(jì)算句子間的相似度

similarity_matrix=cosine_similarity(tfidf_matrix)

#句子得分

sentence_scores=similarity_matrix.sum(axis=1)

#選擇得分最高的句子作為摘要

summary=sentences[sentence_scores.argmax()]

print(summary)3.1.2基于機(jī)器學(xué)習(xí)的方法基于機(jī)器學(xué)習(xí)的提取式摘要方法使用訓(xùn)練好的模型來預(yù)測哪些句子應(yīng)該被包含在摘要中。這些模型可以是監(jiān)督學(xué)習(xí)模型,如支持向量機(jī)(SVM)、決策樹或神經(jīng)網(wǎng)絡(luò),也可以是無監(jiān)督學(xué)習(xí)模型,如聚類算法。示例代碼:基于SVM的提取式摘要fromsklearn.feature_extraction.textimportTfidfVectorizer

fromsklearn.svmimportSVC

fromsklearn.model_selectionimporttrain_test_split

fromsklearn.metricsimportaccuracy_score

importpandasaspd

#示例數(shù)據(jù)集

data={

'text':["自然語言處理是計(jì)算機(jī)科學(xué)領(lǐng)域與人工智能領(lǐng)域中的一個(gè)重要方向。",

"它研究能實(shí)現(xiàn)人與計(jì)算機(jī)之間用自然語言進(jìn)行有效通信的各種理論和方法。",

"自然語言處理是一門融語言學(xué)、計(jì)算機(jī)科學(xué)、數(shù)學(xué)于一體的科學(xué)。"],

'label':[1,0,1]#1表示句子應(yīng)包含在摘要中,0表示不應(yīng)包含

}

df=pd.DataFrame(data)

#特征提取

vectorizer=TfidfVectorizer()

X=vectorizer.fit_transform(df['text'])

y=df['label']

#劃分?jǐn)?shù)據(jù)集

X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)

#訓(xùn)練SVM模型

clf=SVC(kernel='linear')

clf.fit(X_train,y_train)

#預(yù)測

y_pred=clf.predict(X_test)

#評(píng)估模型

accuracy=accuracy_score(y_test,y_pred)

print(f"模型準(zhǔn)確率:{accuracy}")3.2生成式摘要:序列到序列模型與注意力機(jī)制生成式摘要的目標(biāo)是創(chuàng)建一個(gè)全新的、簡潔的文本,它捕捉了原文的主要信息,但并不直接復(fù)制原文的句子。這通常通過使用序列到序列(Seq2Seq)模型來實(shí)現(xiàn),該模型由編碼器和解碼器組成,其中編碼器將輸入文本編碼為一個(gè)固定長度的向量,解碼器則使用這個(gè)向量生成摘要。3.2.1序列到序列模型Seq2Seq模型最初是為機(jī)器翻譯設(shè)計(jì)的,但后來也被應(yīng)用于生成式摘要。編碼器通常是一個(gè)循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN),如LSTM或GRU,而解碼器也是一個(gè)RNN,它生成摘要。示例代碼:基于LSTM的Seq2Seq模型fromtensorflow.keras.modelsimportModel

fromtensorflow.keras.layersimportInput,LSTM,Dense

importnumpyasnp

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

latent_dim=256

num_samples=10000

data_path='data.txt'

#讀取數(shù)據(jù)

input_texts=[]

target_texts=[]

withopen(data_path,'r',encoding='utf-8')asf:

lines=f.read().split('\n')

forlineinlines[:min(num_samples,len(lines)-1)]:

input_text,target_text=line.split('\t')

target_text='\t'+target_text+'\n'

input_texts.append(input_text)

target_texts.append(target_text)

#構(gòu)建模型

encoder_inputs=Input(shape=(None,num_encoder_tokens))

encoder=LSTM(latent_dim,return_state=True)

encoder_outputs,state_h,state_c=encoder(encoder_inputs)

encoder_states=[state_h,state_c]

decoder_inputs=Input(shape=(None,num_decoder_tokens))

decoder_lstm=LSTM(latent_dim,return_sequences=True,return_state=True)

decoder_outputs,_,_=decoder_lstm(decoder_inputs,initial_state=encoder_states)

decoder_dense=Dense(num_decoder_tokens,activation='softmax')

decoder_outputs=decoder_dense(decoder_outputs)

model=Model([encoder_inputs,decoder_inputs],decoder_outputs)

#編譯模型

pile(optimizer='rmsprop',loss='categorical_crossentropy')

#訓(xùn)練模型

model.fit([encoder_input_data,decoder_input_data],decoder_target_data,

batch_size=batch_size,

epochs=epochs,

validation_split=0.2)3.2.2注意力機(jī)制注意力機(jī)制是Seq2Seq模型的一個(gè)重要擴(kuò)展,它允許解碼器在生成摘要時(shí)關(guān)注輸入序列的不同部分。這提高了模型的性能,尤其是在處理長文本時(shí)。示例代碼:帶有注意力機(jī)制的Seq2Seq模型fromtensorflow.keras.layersimportAdditiveAttention

#構(gòu)建帶有注意力的解碼器

decoder_lstm=LSTM(latent_dim,return_sequences=True,return_state=True)

decoder_outputs,_,_=decoder_lstm(decoder_inputs,initial_state=encoder_states)

#添加注意力層

attention=AdditiveAttention()([decoder_outputs,encoder_outputs])

decoder_outputs=attention

#輸出層

decoder_dense=Dense(num_decoder_tokens,activation='softmax')

decoder_outputs=decoder_dense(decoder_outputs)

model=Model([encoder_inputs,decoder_inputs],decoder_outputs)

#編譯模型

pile(optimizer='rmsprop',loss='categorical_crossentropy')

#訓(xùn)練模型

model.fit([encoder_input_data,decoder_input_data],decoder_target_data,

batch_size=batch_size,

epochs=epochs,

validation_split=0.2)通過上述代碼示例,我們可以看到如何使用基于統(tǒng)計(jì)和基于機(jī)器學(xué)習(xí)的方法進(jìn)行提取式摘要,以及如何構(gòu)建帶有注意力機(jī)制的Seq2Seq模型進(jìn)行生成式摘要。這些方法和技術(shù)在自然語言處理領(lǐng)域中是至關(guān)重要的,它們?yōu)樽詣?dòng)摘要提供了強(qiáng)大的工具。4自然語言處理:中文分詞技術(shù)4.1基于規(guī)則的分詞方法4.1.1原理基于規(guī)則的分詞方法主要依賴于詞典和規(guī)則。詞典中包含了大量已知的詞匯,而規(guī)則則用于處理詞典中未收錄的詞匯,如人名、地名等。這種方法通過查找詞典和應(yīng)用規(guī)則來確定文本中的詞邊界。4.1.2內(nèi)容詞典匹配:從左到右或從右到左進(jìn)行匹配,或同時(shí)進(jìn)行雙向匹配,以找到最長的匹配詞。規(guī)則應(yīng)用:對(duì)于詞典中未收錄的詞匯,使用規(guī)則進(jìn)行切分,如根據(jù)詞性、詞頻、上下文等信息。4.1.3示例代碼#基于規(guī)則的分詞示例

fromjiebaimportcut

#定義一個(gè)簡單的詞典

dictionary={'自然語言處理','自動(dòng)摘要','文本預(yù)處理'}

#輸入文本

text="自然語言處理技術(shù)在自動(dòng)摘要和文本預(yù)處理中發(fā)揮著重要作用。"

#使用jieba的cut方法進(jìn)行分詞

#注意:實(shí)際應(yīng)用中,jieba會(huì)使用其內(nèi)置的詞典,這里僅為示例

words=cut(text,cut_all=False)

#輸出分詞結(jié)果

print("分詞結(jié)果:")

forwordinwords:

ifwordindictionary:

print(f"{word}(詞典匹配)")

else:

print(f"{word}(規(guī)則應(yīng)用)")4.2基于統(tǒng)計(jì)的分詞方法4.2.1原理基于統(tǒng)計(jì)的分詞方法通過分析大量文本數(shù)據(jù),統(tǒng)計(jì)詞匯出現(xiàn)的頻率和上下文信息,從而構(gòu)建詞匯模型。這種方法假設(shè)高頻出現(xiàn)的詞匯更可能是真實(shí)的詞。4.2.2內(nèi)容詞頻統(tǒng)計(jì):計(jì)算文本中所有可能的詞匯組合出現(xiàn)的頻率。上下文分析:分析詞匯在不同上下文中的出現(xiàn)情況,以確定其是否為詞。模型構(gòu)建:基于詞頻和上下文信息構(gòu)建詞匯模型。4.2.3示例代碼#基于統(tǒng)計(jì)的分詞示例

fromjiebaimportanalyse

#輸入文本

text="自然語言處理技術(shù)在自動(dòng)摘要和文本預(yù)處理中發(fā)揮著重要作用。"

#使用jieba的TF-IDF算法進(jìn)行關(guān)鍵詞提取

#這里TF-IDF算法可以看作是基于統(tǒng)計(jì)的分詞方法的一種應(yīng)用

tags=analyse.extract_tags(text,topK=5,withWeight=False)

#輸出關(guān)鍵詞

print("關(guān)鍵詞:")

fortagintags:

print(tag)4.3混合分詞方法:規(guī)則與統(tǒng)計(jì)的結(jié)合4.3.1原理混合分詞方法結(jié)合了基于規(guī)則和基于統(tǒng)計(jì)的分詞方法的優(yōu)點(diǎn)。它首先使用詞典和規(guī)則進(jìn)行分詞,然后通過統(tǒng)計(jì)分析來優(yōu)化分詞結(jié)果,提高分詞的準(zhǔn)確性和覆蓋率。4.3.2內(nèi)容詞典和規(guī)則應(yīng)用:使用詞典和規(guī)則進(jìn)行初步分詞。統(tǒng)計(jì)優(yōu)化:基于統(tǒng)計(jì)信息對(duì)初步分詞結(jié)果進(jìn)行優(yōu)化,如調(diào)整詞邊界、識(shí)別新詞等。4.3.3示例代碼#混合分詞方法示例

fromjiebaimportcut

fromjiebaimportanalyse

#定義一個(gè)簡單的詞典

dictionary={'自然語言處理','自動(dòng)摘要','文本預(yù)處理'}

#輸入文本

text="自然語言處理技術(shù)在自動(dòng)摘要和文本預(yù)處理中發(fā)揮著重要作用。"

#使用jieba的cut方法進(jìn)行基于規(guī)則的分詞

words=cut(text,cut_all=False)

#使用jieba的TF-IDF算法進(jìn)行基于統(tǒng)計(jì)的關(guān)鍵詞提取

tags=analyse.extract_tags(text,topK=5,withWeight=False)

#輸出分詞結(jié)果和關(guān)鍵詞

print("分詞結(jié)果:")

forwordinwords:

print(word)

print("\n關(guān)鍵詞:")

fortagintags:

print(tag)4.4結(jié)合使用在實(shí)際應(yīng)用中,通常會(huì)結(jié)合使用基于規(guī)則和基于統(tǒng)計(jì)的分詞方法,以達(dá)到最佳的分詞效果。例如,可以先使用基于規(guī)則的方法進(jìn)行初步分詞,然后使用基于統(tǒng)計(jì)的方法對(duì)分詞結(jié)果進(jìn)行優(yōu)化,識(shí)別出詞典中未收錄的新詞。通過上述示例,我們可以看到,基于規(guī)則的分詞方法能夠快速地識(shí)別出詞典中的詞匯,而基于統(tǒng)計(jì)的分詞方法則能夠幫助我們識(shí)別出文本中的關(guān)鍵詞。混合分詞方法結(jié)合了兩者的優(yōu)點(diǎn),能夠更準(zhǔn)確地進(jìn)行中文分詞。5文本預(yù)處理實(shí)戰(zhàn)5.1使用Python進(jìn)行文本清洗文本清洗是自然語言處理中一個(gè)關(guān)鍵的預(yù)處理步驟,它旨在去除文本中的噪聲,如HTML標(biāo)簽、特殊字符、數(shù)字、停用詞等,以提高后續(xù)處理的效率和準(zhǔn)確性。下面,我們將通過一個(gè)具體的例子來展示如何使用Python進(jìn)行文本清洗。5.1.1示例代碼importre

importjieba

frombs4importBeautifulSoup

defclean_text(text):

"""

清洗文本函數(shù),去除HTML標(biāo)簽、特殊字符和停用詞。

參數(shù):

text--需要清洗的原始文本

返回:

cleaned_text--清洗后的文本

"""

#去除HTML標(biāo)簽

text=BeautifulSoup(text,'html.parser').get_text()

#去除非漢字字符

text=re.sub(r'[^\u4e00-\u9fa5]','',text)

#分詞并去除停用詞

stopwords=load_stopwords()#假設(shè)我們有一個(gè)加載停用詞的函數(shù)

words=jieba.cut(text)

text=''.join([wordforwordinwordsifwordnotinstopwords])

returntext

#示例文本

html_text="""

<html>

<body>

<p>這是一個(gè)示例文本,包含一些HTML標(biāo)簽,如<b>粗體</b>和<i>斜體</i>。</p>

<p>還有數(shù)字123和特殊字符!@#。</p>

</body>

</html>

"""

#清洗文本

cleaned_text=clean_text(html_text)

print(cleaned_text)5.1.2代碼解釋去除HTML標(biāo)簽:使用BeautifulSoup庫解析HTML,提取純文本。去除非漢字字符:使用正則表達(dá)式re.sub函數(shù),將非漢字字符替換為空格。分詞并去除停用詞:使用jieba庫進(jìn)行中文分詞,然后從分詞結(jié)果中去除停用詞。5.2中文分詞實(shí)戰(zhàn):jieba與THULAC中文分詞是自然語言處理中的另一個(gè)重要步驟,它將連續(xù)的漢字序列切分成具有語義意義的詞匯。在Python中,jieba和THULAC是兩個(gè)常用的中文分詞庫。5.2.1jieba分詞示例importjieba

defjieba_segment(text):

"""

使用jieba進(jìn)行中文分詞。

參數(shù):

text--需要分詞的文本

返回:

segmented_text--分詞后的文本

"""

words=jieba.cut(text)

segmented_text=''.join(words)

returnsegmented_text

#示例文本

text="自然語言處理技術(shù)在自動(dòng)摘要中的應(yīng)用"

#分詞

segmented_text=jieba_segment(text)

print(segmented_text)5.2.2THULAC分詞示例fromthulacimportthulac

defthulac_segment(text):

"""

使用THULAC進(jìn)行中文分詞和詞性標(biāo)注。

參數(shù):

text--需要分詞的文本

返回:

segmented_text--分詞后的文本

"""

thu=thulac()

words=thu.cut(text,text=True)

segmented_text=''.join([wordforword,_inwords])

returnsegmented_text

#示例文本

text="自然語言處理技術(shù)在自動(dòng)摘要中的應(yīng)用"

#分詞

segmented_text=thulac_segment(text)

print(segmented_text)5.2.3分詞庫對(duì)比jieba:簡單易用,速度快,適合大規(guī)模文本處理。THULAC:除了分詞,還提供詞性標(biāo)注功能,但速度相對(duì)較慢。通過以上示例,我們可以看到如何使用Python進(jìn)行文本預(yù)處理,包括文本清洗和中文分詞,這對(duì)于自動(dòng)摘要等自然語言處理任務(wù)至關(guān)重要。6自動(dòng)摘要實(shí)戰(zhàn)6.1提取式摘要的實(shí)現(xiàn):TF-IDF與TextRank6.1.1TF-IDF原理與實(shí)現(xiàn)TF-IDF(TermFrequency-InverseDocumentFrequency)是一種用于信息檢索與文本挖掘的常用加權(quán)技術(shù)。它通過計(jì)算詞頻(TF)和逆文檔頻率(IDF)的乘積來評(píng)估一個(gè)詞對(duì)文檔的重要性。TF-IDF計(jì)算公式詞頻(TF):一個(gè)詞在文檔中出現(xiàn)的頻率,計(jì)算公式為:T,其中ft,d表示詞t逆文檔頻率(IDF):衡量一個(gè)詞的普遍重要性,計(jì)算公式為:I,其中N是文檔總數(shù),nt是包含詞tTF-IDF代碼示例fromsklearn.feature_extraction.textimportTfidfVectorizer

#示例文本

documents=[

"自然語言處理是人工智能領(lǐng)域的一個(gè)重要分支。",

"自動(dòng)摘要技術(shù)在新聞、學(xué)術(shù)論文等領(lǐng)域有廣泛應(yīng)用。",

"文本預(yù)處理與分詞技術(shù)是自然語言處理的基礎(chǔ)。",

"Seq2Seq模型在生成式摘要中扮演重要角色。"

]

#創(chuàng)建TF-IDF向量化器

vectorizer=TfidfVectorizer()

#計(jì)算TF-IDF

tfidf_matrix=vectorizer.fit_transform(documents)

#輸出特征名稱和TF-IDF矩陣

features=vectorizer.get_feature_names_out()

print("Features:",features)

print("TF-IDFMatrix:\n",tfidf_matrix.toarray())6.1.2TextRank算法TextRank算法是PageRank算法在文本處理中的應(yīng)用,主要用于關(guān)鍵詞提取和句子排序,以生成提取式摘要。TextRank算法步驟構(gòu)建圖:將文本中的句子視為圖中的節(jié)點(diǎn),句子之間的相似度作為邊的權(quán)重。計(jì)算相似度:使用余弦相似度或Jaccard相似度等方法計(jì)算句子之間的相似度。迭代更新權(quán)重:根據(jù)PageRank算法迭代更新每個(gè)句子的權(quán)重。選擇摘要:選擇權(quán)重最高的前k個(gè)句子作為摘要。TextRank代碼示例importnumpyasnp

fromsklearn.metrics.pairwiseimportcosine_similarity

fromnltk.tokenizeimportsent_tokenize

fromsumy.parsers.plaintextimportPlaintextParser

fromsumy.nlp.tokenizersimportTokenizer

fromsumy.summarizers.text_rankimportTextRankSummarizer

#示例文本

text="自然語言處理是人工智能領(lǐng)域的一個(gè)重要分支。自動(dòng)摘要技術(shù)在新聞、學(xué)術(shù)論文等領(lǐng)域有廣泛應(yīng)用。文本預(yù)處理與分詞技術(shù)是自然語言處理的基礎(chǔ)。Seq2Seq模型在生成式摘要中扮演重要角色。"

#使用sumy庫實(shí)現(xiàn)TextRank

parser=PlaintextParser.from_string(text,Tokenizer("chinese"))

summarizer=TextRankSummarizer()

summary=summarizer(parser.document,2)#生成包含2個(gè)句子的摘要

#輸出摘要

forsentenceinsummary:

print(sentence)6.2生成式摘要的實(shí)現(xiàn):使用Seq2Seq模型6.2.1Seq2Seq模型原理Seq2Seq(SequencetoSequence)模型是一種用于序列生成任務(wù)的神經(jīng)網(wǎng)絡(luò)模型,如機(jī)器翻譯、對(duì)話系統(tǒng)和文本摘要。它由編碼器(Encoder)和解碼器(Decoder)兩部分組成,編碼器將輸入序列編碼為一個(gè)固定長度的向量,解碼器則將這個(gè)向量解碼為輸出序列。Seq2Seq模型結(jié)構(gòu)編碼器:通常是一個(gè)循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN),如LSTM或GRU,用于讀取輸入序列并生成一個(gè)上下文向量。解碼器:也是一個(gè)循環(huán)神經(jīng)網(wǎng)絡(luò),用于生成輸出序列。在每個(gè)時(shí)間步,解碼器不僅考慮當(dāng)前的輸入,還考慮編碼器生成的上下文向量。Seq2Seq模型訓(xùn)練與預(yù)測訓(xùn)練時(shí),模型學(xué)習(xí)輸入序列與輸出序列之間的映射關(guān)系;預(yù)測時(shí),模型基于輸入序列生成新的輸出序列。Seq2Seq代碼示例fromtensorflow.keras.modelsimportModel

fromtensorflow.keras.layersimportInput,LSTM,Dense

importnumpyasnp

#示例數(shù)據(jù)

input_texts=["自然語言處理","自動(dòng)摘要技術(shù)"]

target_texts=["NLP","summary"]

#數(shù)據(jù)預(yù)處理

input_token_index={"自然":1,"語言":2,"處理":3,"自動(dòng)":4,"摘要":5,"技術(shù)":6}

target_token_index={"NLP":1,"summary":2}

encoder_input_data=np.array([[1,2,3],[4,5,6]])

decoder_input_data=np.array([[0,1],[0,2]])#0表示起始標(biāo)記

decoder_target_data=np.array([[1,2],[1,2]])#與target_texts對(duì)應(yīng)

#構(gòu)建模型

encoder_inputs=Input(shape=(None,))

encoder=LSTM(256,return_state=True)

encoder_outputs,state_h,state_c=encoder(encoder_inputs)

encoder_states=[state_h,state_c]

decoder_inputs=Input(shape=(None,))

decoder_lstm=LSTM(256,return_sequences=True,return_state=True)

decoder_outputs,_,_=decoder_lstm(decoder_inputs,initial_state=encoder_states)

decoder_dense=Dense(len(target_token_index),activation='softmax')

decoder_outputs=decoder_dense(decoder_outputs)

model=Model([encoder_inputs,decoder_inputs],decoder_outputs)

#編譯模型

pile(optimizer='rmsprop',loss='categorical_crossentropy')

#訓(xùn)練模型

model.fit([encoder_input_data,decoder_input_data],decoder_target_data,epochs=100,batch_size=64)

#預(yù)測

encoder_model=Model(encoder_inputs,encoder_states)

decoder_state_input_h=Input(shape=(256,))

decoder_state_input_c=Input(shape=(256,))

decoder_states_inputs=[decoder_state_input_h,decoder_state_input_c]

decoder_outputs,state_h,state_c=decoder_lstm(decoder_inputs,initial_state=decoder_states_inputs)

decoder_states=[state_h,state_c]

decoder_outputs=decoder_dense(decoder_outputs)

decoder_model=Model([decoder_inputs]+decoder_states_inputs,[decoder_outputs]+decoder_states)

#使用模型生成摘要

defdecode_sequence(input_seq):

states_value=encoder_model.predict(input_seq)

target_seq=np.zeros((1,1))

target_seq[0,0]=0#起始標(biāo)記

stop_condition=False

decoded_sentence=''

whilenotstop_condition:

output_tokens,h,c=decoder_model.predict([target_seq]+states_value)

sampled_token_index=np.argmax(output_tokens[0,-1,:])

sampled_char=reverse_target_char_index[sampled_token_index]

decoded_sentence+=sampled_char

ifsampled_char=='\n'orlen(decoded_sentence)>max_decoder_seq_length:

stop_condition=True

target_seq=np.zeros((1,1))

target_seq[0,0]=sampled_token_index

states_value=[h,c]

returndecoded_sentence

#輸入序列

input_seq=np.array([[1,2,3]])

#生成摘要

decoded_sentence=decode_sequence(input_seq)

print("GeneratedSummary:",decoded_sentence)6.2.2總結(jié)通過上述示例,我們了解了提取式摘要和生成式摘要的基本實(shí)現(xiàn)方法。提取式摘要利用TF-IDF和TextRank算法從原文中選擇關(guān)鍵句子,而生成式摘要?jiǎng)t使用Seq2Seq模型生成新的摘要文本。這些技術(shù)在自動(dòng)摘要領(lǐng)域有著廣泛的應(yīng)用,能夠幫助我們快速理解長篇文檔的主要內(nèi)容。7評(píng)估與優(yōu)化自動(dòng)摘要系統(tǒng)7.1自動(dòng)摘要的評(píng)價(jià)指標(biāo):ROUGE與BLEU7.1.1ROUGE(Recall-OrientedUnderstudyforGistingEvaluation)ROUGE是一種常用的自動(dòng)摘要評(píng)價(jià)指標(biāo),主要用于評(píng)估生成的摘要與參考摘要之間的相似度。ROUGE主要有三種類型:ROUGE-N、ROUGE-L和ROUGE-S。ROUGE-N:計(jì)算n-gram的召回率和精確率。n-gram是連續(xù)的n個(gè)詞的序列。例如,ROUGE-1計(jì)算單個(gè)詞的匹配,ROUGE-2計(jì)算連續(xù)兩個(gè)詞的匹配。ROUGE-L:基于最長公共子序列(LongestCommonSubsequence,LCS)來計(jì)算匹配度,考慮了詞序的影響。ROUGE-S:使用skip-bigram來計(jì)算匹配度,允許在兩個(gè)匹配的詞之間有任意數(shù)量的詞。示例代碼fromrougeimportRouge

#初始化ROUGE評(píng)估器

rouge=Rouge()

#生成的摘要和參考摘要

generated_summary="這是一段生成的摘要。"

reference_summary="這是參考摘要,用于比較。"

#計(jì)算ROUGE分?jǐn)?shù)

scores=rouge.get_scores(generated_summary,reference_summary)

#輸出ROUGE-1、ROUGE-2和ROUGE-L的分?jǐn)?shù)

print("ROUGE-1:",scores[0]['rouge-1']['f'])

print("ROUGE-2:",scores[0]['rouge-2']['f'])

print("ROUGE-L:",scores[0]['rouge-l']['f'])7.1.2BLEU(BilingualEvaluationUnderstudy)BLEU是另一種廣泛使用的自動(dòng)摘要評(píng)價(jià)指標(biāo),最初設(shè)計(jì)用于評(píng)估機(jī)器翻譯的質(zhì)量,但同樣適用于自動(dòng)摘要。BLEU計(jì)算生成的摘要與多個(gè)參考摘要之間的n-gram精確率。BLEU-1:計(jì)算單個(gè)詞的精確率。BLEU-2:計(jì)算連續(xù)兩個(gè)詞的精確率。BLEU-3:計(jì)算連續(xù)三個(gè)詞的精確率。BLEU-4:計(jì)算連續(xù)四個(gè)詞的精確率。BLEU分?jǐn)?shù)還考慮了“BrevityPenalty”,以懲罰生成的摘要長度過短的情況。示例代碼fromnltk.translate.bleu_scoreimportsentence_bleu

#生成的摘要和參考摘要

generated_summary="這是一段生成的摘要。"

reference_summaries=[["這是參考摘要,用于比較。"],["生成的摘要應(yīng)該與這個(gè)相似。"]]

#計(jì)算BLEU分?jǐn)?shù)

#注意:參考摘要需要以列表的列表形式提供

bleu_score=sentence_bleu(reference_summaries,generated_summary)

#輸出BLEU分?jǐn)?shù)

print("BLEUScore:",bleu_score)7.2系統(tǒng)優(yōu)化:參數(shù)調(diào)整與模型選擇自動(dòng)摘要系統(tǒng)的優(yōu)化通常涉及兩個(gè)關(guān)鍵方面:參數(shù)調(diào)整和模型選擇。7.2.1參數(shù)調(diào)整參數(shù)調(diào)整是通過調(diào)整模型的超參數(shù)來優(yōu)化模型性能的過程。超參數(shù)是在訓(xùn)練模型之前設(shè)置的參數(shù),例如學(xué)習(xí)率、批次大小、隱藏層單元數(shù)等。調(diào)整這些參數(shù)可以顯著影響模型的訓(xùn)練速度和最終性能。示例代碼fromsklearn.model_selectionimportGridSearchCV

fromsklearn.linear_modelimportLogisticRegression

#定義模型

model=LogisticRegression()

#定義要搜索的參數(shù)網(wǎng)格

param_grid={'C':[0.1,1,10,100],'penalty':['l1','l2']}

#使用GridSearchCV進(jìn)行參數(shù)搜索

grid_search=GridSearchCV(model,param_grid,cv=5)

grid_search.fit(X_train,y_train)

#輸出最佳參數(shù)

print("Bestparameters:",grid_search.best_params_)7.2.2模型選擇模型選擇涉及從多個(gè)候選模型中選擇最佳模型。這通?;谀P驮隍?yàn)證集上的性能。不同的模型可能對(duì)不同的任務(wù)和數(shù)據(jù)集有不同的表現(xiàn),因此選擇最適合當(dāng)前任務(wù)的模型至關(guān)重要。示例代碼fromsklearn.model_selectionimportcross_val_score

fromsklearn.linear_modelimportLogisticRegression

fromsklearn.ensembleimportRandomForestClassifier

#初始化多個(gè)模型

models=[

('LogisticRegression',LogisticRegression()),

('RandomForest',RandomForestClassifier())

]

#評(píng)估每個(gè)模型在驗(yàn)證集上的性能

results=[]

names=[]

forname,modelinmodels:

scores=cross_val_score(model,X_train,y_train,cv=5)

results.append(scores)

names.append(name)

print("%s:%0.2f(+/-%0.2f)"%(name,scores.mean(),scores.std()*2))通過上述代碼,我們可以比較不同模型在驗(yàn)證集上的平均性能和標(biāo)準(zhǔn)差,從而選擇表現(xiàn)最佳的模型進(jìn)行最終的摘要生成任務(wù)。8自然語言處理:案例分析與應(yīng)用擴(kuò)展8.1新聞自動(dòng)摘要案例分析8.1.1引言在自然語言處理領(lǐng)域,自動(dòng)摘要技術(shù)被廣泛應(yīng)用于新聞、文檔和會(huì)議記錄的處理中,以快速提取關(guān)鍵信息,生成簡潔的摘要。本章節(jié)將通過一個(gè)新聞自動(dòng)摘要的案例,深入分析文本預(yù)處理與分詞技術(shù)在自動(dòng)摘要中的應(yīng)用。8.1.2數(shù)據(jù)樣例假設(shè)我們有以下新聞文本:標(biāo)題:中國成功發(fā)射火星探測器

內(nèi)容:中國于2021年7月23日成功發(fā)射了火星探測器“天問一號(hào)”,標(biāo)志著中國航天事業(yè)邁入了新的階段。此次發(fā)射任務(wù)旨在探索火星的地質(zhì)結(jié)構(gòu)、大氣環(huán)境以及尋找可能存在的生命跡象。探測器預(yù)計(jì)將在2022年2月到達(dá)火星軌道,開始進(jìn)行科學(xué)探測。8.1.3文本預(yù)處理文本預(yù)處理是自動(dòng)摘要的第一步,它包括去除停用詞、標(biāo)點(diǎn)符號(hào)、數(shù)字和特殊字符,以及將文本轉(zhuǎn)換為小寫等操作。以下是一個(gè)使用Python進(jìn)行文本預(yù)處理的示例:importre

fromnltk.corpusimportstopwords

fromnltk.tokenizeimportword_tokenize

#假設(shè)text是我們要處理的新聞文本

text="中國于2021年7月23日成功發(fā)射了火星探測器“天問一號(hào)”,標(biāo)志著中國航天事業(yè)邁入了新的階段。此次發(fā)射任務(wù)旨在探索火星的地質(zhì)結(jié)構(gòu)、大氣環(huán)境以及尋找可能存在的生命跡象。探測器預(yù)計(jì)將在2022年2月到達(dá)火星軌道,開始進(jìn)行科學(xué)探測。"

#去除標(biāo)點(diǎn)符號(hào)和數(shù)字

text=re.sub(r'[^\w\s]','',text)

text=re.sub(r'\d+','',text)

#轉(zhuǎn)換為小寫

text=text.lower()

#分詞

words=word_tokenize(text)

#去除停用詞

stop_words=set(stopwords.words('chinese'))

filtered_words=[wordforwordinwordsifwordnotinstop_words]

print(filtered_words)注釋:上述代碼使用了正則表達(dá)式去除文本中的標(biāo)點(diǎn)符號(hào)和數(shù)字,然后將文本轉(zhuǎn)換為小寫,使用nltk庫進(jìn)行分詞,并去除停用詞。但請(qǐng)注意,nltk庫并不直接支持中文停用詞,這里需要使用一個(gè)中文停用詞列表。8.1.4分詞技術(shù)分詞是將連續(xù)的文本切分成具有語義的詞語序列的過程。對(duì)于中文文本,由于沒有明顯的詞界,分詞尤為重要。以下是一個(gè)使用jieba庫進(jìn)行中文分詞的示例:importjieba

#假設(shè)text是我們要處理的新聞文本

text="中國于2021年7月23日成功發(fā)射了火星探測器“天問一號(hào)”,標(biāo)志著中國航天事業(yè)邁入了新的階段。此次發(fā)射任務(wù)旨在探索火星的地質(zhì)結(jié)構(gòu)、大氣環(huán)境以及尋找可能存在的生命跡象。探測器預(yù)計(jì)將在2022年2月到達(dá)火星軌道,開始進(jìn)行科學(xué)探測。"

#使用jieba進(jìn)行分詞

words=jieba.cut(text)

#打印分詞結(jié)果

print("".join(words))注釋:jieba是一個(gè)用于中文分詞的Python庫,它使用了基

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論