一、說明
????????自然語言處理 (NLP) 是人工智能 (AI) 和計算語言學的一個子領域,專注于使計算機能夠理解、解釋和生成人類語言。它涉及計算機和自然語言之間的交互,允許機器以對人類有意義和有用的方式處理、分析和響應文本或口頭數據。
二、重要術語
????????NLP中使用的一些重要術語如下:
- 公文:在NLP中,文檔是指單個文本單元,通常表示為段落,句子甚至單個單詞。它是 NLP 任務中文本數據的基本構建塊。例如,在包含客戶評論的數據集中,每個單獨的評論都被視為一個文檔。
- 語料庫:?語料庫是為語言模型訓練或分析而組裝的文檔集合。它是所研究語言或領域的代表性樣本。例如,用于情緒分析的語料庫可能包含從各種來源收集的數千條客戶評論。
- 詞匯:語料庫的詞匯是指整個文檔集合中存在的獨特單詞集。它基本上表示在特定上下文中使用的單詞。例如,醫學文章語料庫的詞匯可能包括“疾病”、“治療”和“癥狀”等詞。
- 分割:分割是將文本塊(例如段落)分解為單個句子的過程。正確的分割對于各種NLP任務至關重要,例如機器翻譯或情感分析。例如,考慮文本:“我喜歡NLP。這太令人著迷了。分割會把它分成兩句話:“我喜歡NLP”和“它很迷人”。
- 標記化:標記化是將句子或文本分解為單個單詞或子單詞的過程,稱為標記。每個令牌代表一個有意義的單元,它是 NLP 預處理的基本步驟。例如,句子“自然語言處理是驚人的!”將被標記化為以下標記:[“自然”,“語言”,“處理”,“是”,“驚人”,“!”]。
- 停用詞:停用詞是語言中經常出現的常見詞,對于 NLP 任務沒有重要意義或信息。它們通常在預處理過程中被移除,以減少噪聲并提高計算效率。英語中停用詞的例子包括“the”、“and”、“is”等。
- 詞干提取:詞干提取是一種用于通過刪除后綴將單詞簡化為其基本形式或根形式的技術。目標是簡化單詞,以便將同一根詞的變體視為相同。但是,詞干提取可能并不總是產生有意義或有效的單詞。例如,在詞干提取后,單詞“running”和“runs”都將簡化為“run”。
- 詞形還原:詞形還原類似于詞干提取,但通過將單詞簡化為其基本形式或字典形式(引理)更進一步。此過程可確保生成的單詞具有有效的含義。例如,在詞形還原之后,“運行”和“運行”都將被詞形還原為“運行”。
- NER?標記:命名實體識別 (NER) 是對文本中特定實體(例如人名、地點、組織、日期等)進行識別和分類的過程。這些實體通常使用適當的標簽進行標記,例如“人員”、“位置”、“組織”等。例如,在句子“Apple Inc.總部位于庫比蒂諾”中,NER標記會將“Apple Inc.”標記為組織,將“Cupertino”標記為位置。
- POS 標記:詞性 (POS) 標記是為句子中的每個單詞分配語法標簽的過程,指示其句法角色和類別,例如名詞、動詞、形容詞等。例如,在句子“她吃蘋果”中,POS標簽會將“她”標記為代詞,將“吃”標記為動詞,將“蘋果”標記為名詞。
- 分塊:分塊涉及將句子中的相鄰單詞分組為有意義的單元,例如名詞短語或動詞短語。這些塊表示句法單元,可以幫助進一步分析或理解句子的結構。例如,在句子“大貓坐在墊子上”中,分塊會將“大貓”識別為名詞短語,將“坐在墊子上”標識為動詞短語。
三、文本預處理
????????文本預處理是自然語言處理 (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.punctuation
string
str.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()
re
r'[^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_mapping
contraction_mapping
????????文本更正涉及修復文本數據中的常見拼寫錯誤或其他錯誤。拼寫檢查和更正對于提高 NLP 任務的文本數據質量至關重要。
????????對于文本更正,我們將使用庫,它為拼寫檢查和更正等文本處理任務提供了方便的界面。確保您已安裝并安裝。如果沒有,請使用以下命令安裝它們:TextBlob
textblob
nltk
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()
TextBlob
textblob
TextBlob
correct()
TextBlob
????????標記化是將文本分解為單個單詞或標記的過程。這是 NLP 中必不可少的預處理步驟,為進一步分析準備文本。我們將使用該庫,它提供了各種標記化方法。確保您已安裝。如果沒有,請使用以下命令安裝它:nltk
nltk
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
????????停用詞刪除是一個文本預處理步驟,其中從文本中刪除語義含義很少或沒有語義的常用詞(稱為停用詞),以減少干擾并專注于更有意義的單詞。對于停用詞刪除,我們將使用該庫,該庫提供了各種語言的常見停用詞列表。確保您已安裝。如果沒有,請使用以下命令安裝它:nltk
nltk
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()
stopwords
nltk
????????詞干提取是一種文本預處理技術,旨在通過刪除后綴將單詞簡化為其基本形式或根形式。這個過程有助于減少詞匯量,并將同一單詞的不同形式視為相同。對于詞干分析,我們將使用該庫,該庫提供各種詞干分析器,包括波特詞干分析器。確保您已安裝。如果沒有,請使用以下命令安裝它:nltk
nltk
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()
PorterStemmer
nltk.stem
????????詞形還原是一種文本預處理技術,它使用詞匯和形態分析將單詞簡化為其基本形式或根形式(引理)。與詞干提取不同,詞形還原可確保生成的單詞是語言中的有效單詞。對于詞形還原,我們將使用庫,它提供了一個 WordNet 詞形還原器。確保您已安裝。如果沒有,請使用以下命令安裝它:nltk
nltk
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()
WordNetLemmatizer
nltk.stem
四、結論
????????文本預處理是自然語言處理 (NLP) 中的關鍵步驟,涉及將原始文本數據轉換為適合分析和建模的干凈且規范化的格式。基本技術包括小寫、標記化、刪除特殊字符和數字、刪除停用詞、詞干提取、詞形還原、刪除 HTML 標記、刪除 URL、擴展收縮和使用 TextBlob 等工具進行文本更正。
????????通過采用這些文本預處理技術,研究人員和從業者可以提高NLP任務的有效性,例如情感分析,信息檢索,主題建模和文本分類。特定預處理步驟的選擇可能會有所不同,具體取決于數據的性質和手頭 NLP 應用程序的要求。高效的文本預處理在從文本數據中獲得準確而有意義的見解方面起著至關重要的作用。
賽義夫·阿里
???????