使用 Python 在 NLP 中進行文本預處理

一、說明

????????自然語言處理 (NLP) 是人工智能 (AI) 和計算語言學的一個子領域,專注于使計算機能夠理解、解釋和生成人類語言。它涉及計算機和自然語言之間的交互,允許機器以對人類有意義和有用的方式處理分析和響應文本或口頭數據。

二、重要術語

????????NLP中使用的一些重要術語如下:

  1. 公文:在NLP中,文檔是指單個文本單元,通常表示為段落,句子甚至單個單詞。它是 NLP 任務中文本數據的基本構建塊。例如,在包含客戶評論的數據集中,每個單獨的評論都被視為一個文檔。
  2. 語料庫:?語料庫是為語言模型訓練或分析而組裝的文檔集合。它是所研究語言或領域的代表性樣本。例如,用于情緒分析的語料庫可能包含從各種來源收集的數千條客戶評論。
  3. 詞匯:語料庫的詞匯是指整個文檔集合中存在的獨特單詞集。它基本上表示在特定上下文中使用的單詞。例如,醫學文章語料庫的詞匯可能包括“疾病”、“治療”和“癥狀”等詞。
  4. 分割:分割是將文本塊(例如段落)分解為單個句子的過程。正確的分割對于各種NLP任務至關重要,例如機器翻譯或情感分析。例如,考慮文本:“我喜歡NLP。這太令人著迷了。分割會把它分成兩句話:“我喜歡NLP”和“它很迷人”。
  5. 標記化:標記是將句子或文本分解為單個單詞或子單詞的過程,稱為標記。每個令牌代表一個有意義的單元,它是 NLP 預處理的基本步驟。例如,句子“自然語言處理是驚人的!”將被標記化為以下標記:[“自然”,“語言”,“處理”,“是”,“驚人”,“!”]。
  6. 停用詞:停用詞是語言中經常出現的常見,對于 NLP 任務沒有重要意義或信息。它們通常在預處理過程中被移除,以減少噪聲并提高計算效率。英語中停用詞的例子包括“the”、“and”、“is”等。
  7. 干提取:詞干提取是一種用于通過刪除后綴將單詞簡化為其基本形式或根形式的技術。目標是簡化單詞,以便將同一根詞的變體視為相同。但是,詞干提取可能并不總是產生有意義或有效的單詞。例如,在詞干提取后,單詞“running”和“runs”都將簡化為“run”。
  8. 形還原:形還原類似于詞干提取,但通過將單詞簡化為其基本形式或字典形式(引理)更進一步。此過程可確保生成的單詞具有有效的含義。例如,在詞形還原之后,“運行”和“運行”都將被詞形還原為“運行”。
  9. NER?標記:命名實體識別 (NER) 是對文本中特定實體(例如人名、地點、組織、日期等)進行識別和分類的過程。這些實體通常使用適當的標簽進行標記,例如“人員”、“位置”、“組織”等。例如,在句子“Apple Inc.總部位于庫比蒂諾”中,NER標記會將“Apple Inc.”標記為組織,將“Cupertino”標記為位置。
  10. POS 標記:性 (POS) 標記是為句子中的每個單詞分配語法標簽的過程,指示其句法角色和類別,例如名詞、動詞、形容詞等。例如,在句子“她吃蘋果”中,POS標簽會將“她”標記為代詞,將“吃”標記為動詞,將“蘋果”標記為名詞。
  11. 塊:分塊涉及將句子中的相鄰單詞分組為有意義的單元,例如名詞短語或動詞短語。這些塊表示句法單元,可以幫助進一步分析或理解句子的結構。例如,在句子“大貓坐在墊子上”中,分塊會將“大貓”識別為名詞短語,將“坐在墊子上”標識為動詞短語。

三、文本預處理

????????文本預處理是自然語言處理 (NLP) 中基本且必不可少的步驟。其主要目的是清理原始文本數據并將其轉換為適合分析和預測建模的可呈現形式。以下是一些常見的文本預處理技術:

????????小寫是將所有文本轉換為小寫的過程。這是 NLP 中常見的預處理步驟,可確保一致性并避免與區分大小寫相關的問題。Python 中小寫過程的實現如下:

def lowercase_text(text):return text.lower()# Test the function
input_text = "The Quick Brown Fox JUMPS Over 2 Lazy Dogs."
output_text = lowercase_text(input_text)
print(output_text)

????????在上面的代碼中,該函數采用輸入文本,并使用 Python 中可用于字符串的方法將其轉換為小寫。小寫很有用,因為它有助于標準化文本數據并將同一單詞的不同形式視為相同。例如,“Hello”、“hello”和“HELLO”在小寫后都會轉換為“hello”。這對于文本規范化和通過減少詞匯量和以不區分大小寫的方式處理單詞來提高 NLP 模型的準確性至關重要。lowercase_text()lower()

????????刪除標點符號涉及從文本中刪除所有標點符號(例如逗號、句點、感嘆號)。標點符號刪除通常作為文本預處理的一部分執行,以清理 NLP 任務的數據。

import stringdef remove_punctuations(text):translator = str.maketrans('', '', string.punctuation)return text.translate(translator)# Test the function
input_text = "Hello, my name is John! How are you?"
output_text = remove_punctuations(input_text)
print(output_text)

????????在上面的代碼中,我們使用函數從輸入文本中刪除所有標點符號。該函數使用模塊中的常量來獲取包含所有標點字符的字符串。然后,它使用該方法創建一個轉換表,并從輸入文本中刪除標點符號表中的所有字符。remove_punctuations()string.punctuationstringstr.maketrans()translate()

????????刪除特殊字符和數字涉及從文本中刪除任何非字母字符(例如符號、數字)。此步驟對于文本預處理非常有用,可以專注于文本內容,而不會干擾數字或其他非字母字符。

import redef remove_special_characters_numbers(text):# Regular expression to remove non-alphabetic characters and numbersreturn re.sub(r'[^a-zA-Z\s]', '', text)# Test the function
input_text = "Hello, my name is Saif Ali and my age is 25! I was born on 1997-01-10."
output_text = remove_special_characters_numbers(input_text)
print(output_text)

????????在上面的代碼中,我們使用函數從輸入文本中刪除所有特殊字符和數字。該函數使用(正則表達式)模塊中的方法和正則表達式來匹配任何不是大寫或小寫字母或空格的字符。然后,它將這些字符替換為空字符串,有效地將它們從文本中刪除。remove_special_characters_numbers()re.sub()rer'[^a-zA-Z\s]'

????????在處理從網頁或 HTML 文檔中提取的文本數據時,刪除 HTML 標記非常重要。HTML 標記對文本內容沒有貢獻,需要將其刪除以進行進一步的文本分析。

import redef remove_html_tags(text):clean_text = re.sub(r'<.*?>', '', text)return clean_text# Test the function
input_text = "<p>Hello, <b>my name</b> is <i>John</i>!</p>"
output_text = remove_html_tags(input_text)
print(output_text)

????????在上面的代碼中,該函數使用正則表達式 () 從輸入文本中刪除所有 HTML 標記。正則表達式匹配以“<”開頭,后跟任何字符 (“.*”)并以“>”結尾的任何模式。這將有效地刪除任何 HTML 標記并保留文本內容。remove_html_tags()re.sub()r'<.*?>'

????????在處理來自網頁或社交媒體的文本數據時,刪除 URL 是一個常見的預處理步驟,其中 URL 不會向文本分析添加任何有意義的信息。

import redef remove_urls(text):clean_text = re.sub(r'http\S+|www\S+', '', text)return clean_text# Test the function
input_text = "Check out my LinkedIn account: https://www.linkedin.com/in/imsaifali/"
output_text = remove_urls(input_text)
print(output_text)

????????在上面的代碼中,該函數使用正則表達式 () 從輸入文本中刪除任何 URL。正則表達式匹配任何以“http://”或“https://”開頭的URL(http后跟非空格字符)或以“www”開頭的URL。(www 后跟非空格字符)。這有效地從文本中刪除了任何 URL。remove_urls()re.sub()r'http\S+|www\S+'\S+\S+

????????刪除多余空格是一個文本預處理步驟,涉及刪除文本中單詞之間的任何不必要或過多的空格。這可確保文本干凈且一致。

import redef remove_extra_spaces(text):clean_text = re.sub(r'\s+', ' ', text)return clean_text.strip()# Test the function
input_text = "Hello    there,     how    are   you?"
output_text = remove_extra_spaces(input_text)
print(output_text)

????????在上面的代碼中,該函數使用正則表達式 () 刪除一個或多個空格字符(空格、制表符、換行符)的任何序列,并將它們替換為單個空格。正則表達式匹配一個或多個空格字符。然后,該方法用于刪除任何前導空格或尾隨空格。remove_extra_spaces()re.sub()r'\s+'strip()

????????擴展收縮是將單詞的收縮形式(例如,“不要”,“不能”)轉換為其完整形式(例如,“不要”,“不能”)的過程。此步驟對于標準化文本和避免 NLP 任務中的潛在歧義非常有用。

contraction_mapping = {"ain't": "is not","aren't": "are not","can't": "cannot","couldn't": "could not","didn't": "did not","doesn't": "does not","don't": "do not","hadn't": "had not","hasn't": "has not","haven't": "have not","he's": "he is","he'll": "he will","he'd": "he would","i've": "I have","i'll": "I will","i'd": "I would","i'm": "I am","isn't": "is not","it's": "it is","it'll": "it will","it'd": "it would","let's": "let us","mightn't": "might not","mustn't": "must not","shan't": "shall not","she's": "she is","she'll": "she will","she'd": "she would","shouldn't": "should not","that's": "that is","there's": "there is","they're": "they are","they've": "they have","they'll": "they will","they'd": "they would","we're": "we are","we've": "we have","we'll": "we will","we'd": "we would","weren't": "were not","what's": "what is","won't": "will not","wouldn't": "would not","you're": "you are","you've": "you have","you'll": "you will","you'd": "you would","isn't": "is not","it's": "it is","that's": "that is","there's": "there is","here's": "here is","who's": "who is","what's": "what is","where's": "where is","when's": "when is","why's": "why is","how's": "how is",
}def expand_contractions(text):words = text.split()expanded_words = [contraction_mapping[word.lower()] if word.lower() in contraction_mapping else word for word in words]return ' '.join(expanded_words)# Test the function
input_text = "I can't believe it's already Friday!"
output_text = expand_contractions(input_text)
print(output_text)

? ? ? ? 在上面的代碼中,我們使用函數來擴展輸入文本中的收縮。該函數利用包含常見收縮及其完整形式的字典。它將輸入文本拆分為單詞,并檢查每個單詞(小寫)是否存在于 .如果是這樣,它將用其完整形式替換合同形式。expand_contractions()contraction_mappingcontraction_mapping

????????文本更正涉及修復文本數據中的常見拼寫錯誤或其他錯誤。拼寫檢查和更正對于提高 NLP 任務的文本數據質量至關重要。

????????對于文本更正,我們將使用庫,它為拼寫檢查和更正等文本處理任務提供了方便的界面。確保您已安裝并安裝。如果沒有,請使用以下命令安裝它們:TextBlobtextblobnltk

pip install textblob nltk

現在,讓我們更正文本:

from textblob import TextBlobdef correct_text(text):blob = TextBlob(text)corrected_text = blob.correct()return str(corrected_text)# Test the function
input_text = "I am lerning NLP with Pyhton."
output_text = correct_text(input_text)
print(output_text)

????????在上面的代碼中,我們使用函數來更正輸入文本。該函數使用庫中的類從輸入文本創建對象。然后將該方法應用于對象,該對象會自動執行拼寫更正和其他文本更正。correct_text()TextBlobtextblobTextBlobcorrect()TextBlob

????????標記化是將文本分解為單個單詞或標記的過程。這是 NLP 中必不可少的預處理步驟,為進一步分析準備文本。我們將使用該庫,它提供了各種標記化方法。確保您已安裝。如果沒有,請使用以下命令安裝它:nltknltk

pip install nltk

????????現在,讓我們執行標記化:

import nltk
nltk.download('punkt')
from nltk.tokenize import word_tokenizedef tokenize_text(text):return word_tokenize(text)# Test the function
input_text = "The quick brown fox jumps over the lazy dog."
output_tokens = tokenize_text(input_text)
print(output_tokens)

????????在上面的代碼中,我們使用函數來標記輸入文本。該函數利用模塊中的方法將文本拆分為單個單詞(標記)。tokenize_text()word_tokenize()nltk.tokenize

????????停用詞刪除是一個文本預處理步驟,其中從文本中刪除語義含義很少或沒有語義的常用詞(稱為停用詞),以減少干擾并專注于更有意義的單詞。對于停用詞刪除,我們將使用該庫,該庫提供了各種語言的常見停用詞列表。確保您已安裝。如果沒有,請使用以下命令安裝它:nltknltk

pip install nltk

????????現在,讓我們執行停用詞刪除:

import nltk
nltk.download('punkt')
nltk.download('stopwords')
from nltk.corpus import stopwords
stop_words = set(stopwords.words('english'))def remove_stopwords(text):words = text.split()filtered_words = [word for word in words if word.lower() not in stop_words]return ' '.join(filtered_words)# Test the function
input_text = "The quick brown fox jumps over the lazy dog."
output_text = remove_stopwords(input_text)
print(output_text)

????????在上面的代碼中,我們使用函數從輸入文本中刪除停用詞。該函數首先將文本拆分為單個單詞,然后過濾掉從庫中的語料庫獲取的英語停用詞集中存在的單詞。remove_stopwords()stopwordsnltk

????????詞干提取是一種文本預處理技術,旨在通過刪除后綴將單詞簡化為其基本形式或根形式。這個過程有助于減少詞匯量,并將同一單詞的不同形式視為相同。對于詞干分析,我們將使用該庫,該庫提供各種詞干分析器,包括波特詞干分析器。確保您已安裝。如果沒有,請使用以下命令安裝它:nltknltk

pip install nltk

????????現在,讓我們執行詞干提取:

import nltk
nltk.download('punkt')
from nltk.stem import PorterStemmerdef perform_stemming(text):stemmer = PorterStemmer()words = text.split()stemmed_words = [stemmer.stem(word) for word in words]return ' '.join(stemmed_words)# Test the function
input_text = "jumps jumping jumped"
output_text = perform_stemming(input_text)
print(output_text)

????????在上面的代碼中,我們使用函數將詞干提取應用于輸入文本。該函數利用了來自模塊,這是一種廣泛使用的詞干提取算法。它將輸入文本拆分為單個單詞,對每個單詞應用詞干提取,然后將詞干詞干連接回單個字符串。perform_stemming()PorterStemmernltk.stem

????????詞形還原是一種文本預處理技術,它使用詞匯和形態分析將單詞簡化為其基本形式或根形式(引理)。與詞干提取不同,詞形還原可確保生成的單詞是語言中的有效單詞。對于詞形還原,我們將使用庫,它提供了一個 WordNet 詞形還原器。確保您已安裝。如果沒有,請使用以下命令安裝它:nltknltk

pip install nltk

????????現在,讓我們執行詞形還原:

import nltk
nltk.download('punkt')
nltk.download('wordnet')
from nltk.stem import WordNetLemmatizerdef perform_lemmatization(text):lemmatizer = WordNetLemmatizer()words = text.split()lemmatized_words = [lemmatizer.lemmatize(word) for word in words]return ' '.join(lemmatized_words)# Test the function
input_text = "jumps jumping jumped"
output_text = perform_lemmatization(input_text)
print(output_text)

????????在上面的代碼中,我們使用函數將詞形還原應用于輸入文本。該函數利用來自模塊,該模塊基于WordNet詞匯數據庫。它將輸入文本拆分為單個單詞,對每個單詞應用詞形還原,然后將詞形還原的單詞連接回單個字符串。perform_lemmatization()WordNetLemmatizernltk.stem

四、結論

????????文本預處理是自然語言處理 (NLP) 中的關鍵步驟,涉及將原始文本數據轉換為適合分析和建模的干凈且規范化的格式。基本技術包括小寫、標記化、刪除特殊字符和數字、刪除停用詞、詞干提取、詞形還原、刪除 HTML 標記、刪除 URL、擴展收縮和使用 TextBlob 等工具進行文本更正。

????????通過采用這些文本預處理技術,研究人員和從業者可以提高NLP任務的有效性,例如情感分析,信息檢索,主題建模和文本分類。特定預處理步驟的選擇可能會有所不同,具體取決于數據的性質和手頭 NLP 應用程序的要求。高效的文本預處理在從文本數據中獲得準確而有意義的見解方面起著至關重要的作用。

賽義夫·阿里

???????

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/37201.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/37201.shtml
英文地址,請注明出處:http://en.pswp.cn/news/37201.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java # JVM內存管理

一、運行時數據區域 程序計數器、Java虛擬機棧、本地方法棧、Java堆、方法區、運行時常量池、直接內存 二、HotSpot虛擬機對象 對象創建&#xff1a; 引用檢查類加載檢查分配內存空間&#xff1a;指針碰撞、空閑列表分配空間初始化對象信息設置&#xff08;對象頭內&#xff0…

?可視化繪圖技巧100篇進階篇(五)-階梯線圖(Step Chart)

目錄 前言 圖表類型特征 適用場景 圖例 繪圖工具及代碼實現 ECharts SMARTBI

安卓中常見的字節碼指令介紹

問題背景 安卓開發過程中&#xff0c;經常要通過看一些java代碼對應的字節碼&#xff0c;來了解java代碼編譯后的運行機制&#xff0c;本文將通過一個簡單的demo介紹一些基本的字節碼指令。 問題分析 比如以下代碼&#xff1a; public class test {public static void main…

Java課題筆記~ JSP編程

4.1 JSP基本語法 JSP (全稱Java Server Pages) 是由 Sun Microsystems 公司倡導和許多公司參與共同創建的一種使軟件開發者可以響應客戶端請求&#xff0c;而動態生成 HTML、XML 或其他格式文檔的Web網頁的技術標準。 JSPHTMLJava JSP的本質是Servlet 訪問JSP的時候&#x…

【設計模式】原型模式

原型模式&#xff08;Prototype Pattern&#xff09;是用于創建重復的對象&#xff0c;同時又能保證性能。這種類型的設計模式屬于創建型模式&#xff0c;它提供了一種創建對象的最佳方式之一。 這種模式是實現了一個原型接口&#xff0c;該接口用于創建當前對象的克隆。當直接…

javaScript:數組的認識與使用以及相關案例

目錄 一.前言 二.數組 1.認識 2.數組的聲明 1.let arr [1,2,3,4] 2.結合構造函數&#xff0c;創建數組 注意&#xff1a; 3.數組長度的設置和獲取 注意 4.刪除數組元素 5.清空數組 三.獲取數組元素 獲取數組元素的幾種方法 1.使用方括號 [] 訪問元素&#xff1…

Keepalived+Lvs高可用高性能負載配置

環境準備 IP配置VIPnode1192.168.134.170LVSKeepalived192.168.134.100node3192.168.134.172LVSKeepalived192.168.134.100node2192.168.134.171做web服務器使用node4192.168.134.173做web服務器使用 1、準備node1與node3環境&#xff08;安裝LVS與Keepalived&#xff09;>…

基于微服務+Java+Spring Cloud +Vue+UniApp +MySql實現的智慧工地云平臺源碼

基于微服務JavaSpring Cloud VueUniApp MySql開發的智慧工地云平臺源碼 智慧工地概念&#xff1a; 智慧工地就是互聯網建筑工地&#xff0c;是將互聯網的理念和技術引入建筑工地&#xff0c;然后以物聯網、移動互聯網技術為基礎&#xff0c;充分應用BIM、大數據、人工智能、移…

滾動條樣式更改

::-webkit-scrollbar 滾動條整體部分&#xff0c;可以設置寬度啥的 ::-webkit-scrollbar-button 滾動條兩端的按鈕 ::-webkit-scrollbar-track 外層軌道 ::-webkit-scrollbar-track-piece 內層滾動槽 ::-webkit-scrollbar-thumb 滾動的滑塊 ::-webkit-scrollbar…

Android布局【RelativeLayout】

文章目錄 介紹常見屬性根據父容器定位根據兄弟組件定位 通用屬性margin 設置組件與父容器的邊距padding 設置組件內部元素的邊距 項目結構主要代碼 介紹 RelativeLayout是一個相對布局&#xff0c;如果不指定對齊位置&#xff0c;都是默認相對于父容器的左上角的開始布局 常見…

TypeScript教程(二)基礎語法與基礎類型

一、基礎語法 TypeScript由以下幾個部分組成 1.模塊 2.函數 3.變量 4.語句和表達式 5.注釋 示例&#xff1a; Runoob.ts 文件代碼&#xff1a; const hello : string "Hello World!" console.log(hello) 以上代碼首先通過 tsc 命令編譯&#xff1a; tsc …

MQTT寶典

文章目錄 1.介紹2.發布和訂閱3.MQTT 數據包結構4.Demo5.EMQX 1.介紹 什么是MQTT協議 MQTT&#xff08;消息隊列遙測傳輸協議&#xff09;&#xff0c;是一種基于發布/訂閱&#xff08;publish/subscribe&#xff09;模式的“輕量級”通訊協議&#xff0c;該協議構建于TCP/IP協…

php、 go 語言怎么結合構建高性能高并發商城。

一、php、 go 語言怎么結合構建高性能高并發商城。 將PHP和Go語言結合起來構建高性能高并發的商城系統可以通過多種方法實現&#xff0c;以利用兩種語言的優勢。下面是一些可能的方法和策略&#xff1a; 1. **微服務架構&#xff1a;** 使用微服務架構&#xff0c;將系統拆分…

安卓快速開發

1.環境搭建 Android Studio下載網頁&#xff1a;https://developer.android.google.cn/studio/index.html 第一次新建工程需要等待很長時間&#xff0c;新建一個Empty Views Activity 項目&#xff0c;右上角選擇要運行的機器&#xff0c;運行就安裝上去了(打開USB調試)。 2…

【Linux】UDP協議——傳輸層

目錄 傳輸層 再談端口號 端口號范圍劃分 認識知名端口號 兩個問題 netstat與iostat pidof UDP協議 UDP協議格式 UDP協議的特點 面向數據報 UDP的緩沖區 UDP使用注意事項 基于UDP的應用層協議 傳輸層 在學習HTTP等應用層協議時&#xff0c;為了便于理解&#xff…

【實操】2023年npm組件庫的創建發布流程

2022年的實踐為基礎&#xff0c;2023年我再建一個組件庫【ZUI】。步驟回顧&#xff1a; 2022年的npm組件包的發布刪除教程_npm i ant-design/pro-components 怎么刪除_啥咕啦嗆的博客-CSDN博客 1.在gitee上創建一個項目,相信你是會的 2.創建初始化項目&#xff0c;看吧&#…

泛型類接口方法學習

一、泛型 1 概念 泛型(Generics)&#xff0c;廣泛的類型。最大用途是給集合容器添加標簽&#xff0c;讓開發人員知道容器里面放到是什么類型&#xff0c;并且自動對放入集合的元素進行類型檢查。 類比實參和形參&#xff0c;我們在對方法中的變量操作時&#xff0c;并沒有指…

深入理解高并發編程 - 深度解析 ThreadPoolExecutor 類

ThreadPoolExecutor 是 Java 標準庫中用于創建和管理線程池的核心類之一。它實現了 ExecutorService 接口&#xff0c;提供了豐富的線程池管理功能。下面將通過源碼解析來深入了解 ThreadPoolExecutor 類的工作原理和各個重要部分。 可以在 Java 源代碼中找到 ThreadPoolExecu…

【新品發布】ChatWork企業知識庫系統源碼

系統簡介 基于前后端分離架構以及Vue3、uni-app、ThinkPHP6.x、PostgreSQL、pgvector技術棧開發&#xff0c;包含PC端、H5端。 ChatWork支持問答式和文檔式知識庫&#xff0c;能夠導入txt、doc、docx、pdf、md等多種格式文檔。 導入數據完成向量化訓練后&#xff0c;用戶提問…

兩個pdf合并成一個pdf怎么合并?這幾個方法值得推薦

兩個pdf合并成一個pdf怎么合并&#xff1f;pdf文件的合并是一個很常見的需求&#xff0c;特別是在處理工作文件或學習資料時。為了更好的幫助你了解如何將兩個pdf文件合并成一個&#xff0c;下面就給大家詳細介紹幾種合并方法。 方法一&#xff1a;使用迅捷PDF轉換器 這是一款…