一、说明
自然语言处理 (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 string
def 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 re
def remove_special_characters_numbers(text):
# Regular expression to remove non-alphabetic characters and numbers
return 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 re
def 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 re
def 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 re
def 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 TextBlob
def 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_tokenize
def 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 PorterStemmer
def 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 WordNetLemmatizer
def 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 应用程序的要求。高效的文本预处理在从文本数据中获得准确而有意义的见解方面起着至关重要的作用。
赛义夫·阿里