NLP中的预处理:使用Python进行文本归一化(一)

本文涉及的产品
NLP自然语言处理_高级版,每接口累计50万次
NLP自然语言处理_基础版,每接口每天50万次
NLP 自学习平台,3个模型定制额度 1个月
简介: NLP中的预处理:使用Python进行文本归一化(一)

我们在有关词干的文章中讨论了文本归一化。但是,词干并不是文本归一化中最重要(甚至使用)的任务。我们还进行了其他一些归一化技术的研究,例如Tokenization,Sentencizing和Lemmatization。但是,还有其他一些用于执行此重要预处理步骤的小方法,将在本文中进行讨论。

640.png

  请记住,没有适用于所有情况的“正确”归一化方法列表。实际上,随着我们对NLP的深入研究,越来越多的人意识到NLP并不像人们想象的那样具有普遍性。尽管有许多有趣的通用工具箱和预制管道,但更精确的系统是针对上下文量身定制的系统。

因此,不应将本文归一化的步骤列表作为硬性规则,而应将其作为对某些文章进行文本归一化的准则。还必须指出的是,在极少数情况下,您可能不想归一化输入-文本中其中更多变化和错误很重要时(例如,考虑测试校正算法)。

了解我们的目标——为什么我们需要文本归一化

   让我们从归一化技术的明确定义开始。自然语言作为一种人力资源,倾向于遵循其创造者随机性的内在本质。这意味着,当我们“产生”自然语言时,我们会在其上加上随机状态。计算机不太擅长处理随机性(尽管使用机器学习算法已将随机性的影响降到最低)。

   当我们归一化自然语言时,我们会尝试减少其随机性,使其更接近预定义的“标准”。这有助于减少计算机必须处理的不同信息的数量,从而提高效率。

image.png

通过归一化,我们希望使“文本分布”更接近“正态”分布。

   当我们归一化自然语言资源时,我们尝试减少其中的随机性

   在那篇关于词干的文章中,我提到了归一化试图使事物更接近“正态分布”。在某种意义上说是正确的,当我们归一化自然语言输入时,我们希望以“良好”和“可预测”的形状使事物“符合预期”,例如遵循正态分布。

   除了数学领域之外,我们还可以讨论将归一化数据输入到我们的NLP系统中的好处

   首先,通过减少随机性,我们减少了待处理的输入变量,提高了总体性能并避免了误报(想象一下,如果软件日志行中没有错字,就会触发警告。)。对于系统和信息检索任务来说,这是非常正确的(想象一下,如果Google的搜索引擎仅与您键入的单词完全匹配!)。

image.png

从某种意义上讲,可以将归一化与“去除尖锐边缘”方法进行比较。

   其次,尤其是在讨论机器学习算法时,如果我们使用的是字词袋或TF-IDF字典等简单的旧结构,则归一化会降低输入的维数;或降低载入数据所需的处理量。

   第三,归一化有助于在将输入传递给我们的决策NLP算法之前对其进行处理。在这种情况下,我们确保我们的输入将在处理之前遵循“合同”。

   最后,如果正确完成,归一化对于从自然语言输入中可靠地提取统计数据非常重要-就像在其他领域(例如时间序列分析)一样,归一化是NLP数据科学家/分析师/工程师手中重要的一步。

我们归一化的对象是什么?

   这是一个重要的问题。在进行文本归一化时,我们应该确切地知道我们要标归一什么以及为什么要归一化。另外,输入数据的特点有助于确定我们将要用来归一化输入的步骤。我们最感兴趣的是两件事:

  • 句子结构:它总是以标点符号结尾吗?会出现重复的标点符号吗?我们是否应该删除所有标点符号?此外,可以使用更具体的结构(就像主谓宾结构),但很难实现。
  • 词汇: 这是需要注意的核心内容之一。大多数时候,我们希望我们的词汇量尽可能小。原因是,在NLP中,词汇是我们的主要特征,而当我们在这些词汇中的变化较少时,我们可以更好地实现目标。

   实际上,我们可以通过分解成更简单的问题来对这两个方面进行归一化。以下是最常见的方法:

→删除重复的空格和标点符号。

→去除口音(如果您的数据包含来自“外国”语言的变音符号-这有助于减少与编码类型有关的错误)。

→去除大写字母(通常,使用小写单词可获得更好的结果。但是,在某些情况下,大写字母对于提取信息(例如名称和位置)非常重要)。

→删除或替换特殊字符/表情符号(例如:删除主题标签)。

→替换单词缩写(英语中很常见;例如:“我”→“我是”)。

→将单词数字转换为阿拉伯数字(例如:“二十三”→“ 23”)。

→为特殊符号替换(例如:“ $ 50”→“钱”)。

→缩写标准化(例如:“ US”→“美国” /“美国”,“ btw”→“顺便说一下”)。

→标准化日期格式,社会保险号或其他具有标准格式的数据。

→拼写纠正(可以说一个单词可以用无限方式拼写错误,因此拼写纠正可以通过“更正”来减少词汇变化)–如果您要处理推特,即时消息和电子邮件等开放用户输入的数据,这一点非常重要。

→通过词干去除性别/时间/等级差异。

→将稀有单词替换为更常见的同义词。

→停止定型化(比归一化技术更常见的降维技术)。


   在本文中,我将只讨论其中一部分的实现。

如何做归一化工作

   要选择我们将要使用的归一化步骤,我们需要一项特定的任务。对于本文,我们将假设我们要提取3000个#COVIDIOTS主题标签的情绪集,以了解人们对COVID-19流行的看法。

   我获得了这些推文,可以在这里下载。我还使用这个名为best-profanity的漂亮工具来审查不好的文字,如果需要,可以将其添加到规范化管道中。他们也不包含撰写内容的人。

   但是,我并没有继续删除每条推文中的姓名或检查任何政治立场等,因为这不是本文的目的,并且可以单独撰写另一篇文章(关于自动审查)。

   在这种情况下,我们要执行以下步骤:删除重复的空白和标点符号;缩写替代;拼写更正。另外,我们已经讨论了定形化,下面我们使用它。

   在完成代码部分之后,我们将统计分析应用上述归一化步骤的结果。

   关于规范化的一件重要事情是函数的顺序很重要。我们可以说归一化是NLP预处理管道中的管道。如果我们不谨慎,则可能删除对以后的步骤很重要的信息(例如在定形之前删除停用词)。

   我们甚至可以将这些步骤分为两个连续的组:“标记前步骤”(用于修改句子结构的步骤)和“标记后步骤”(仅用于修改单个标记的步骤),以避免重复标记步骤。但是,为简单起见,我们使用.split()函数。

640.png

像生产线一样,归一化步骤的顺序也很重要。

   将推文解析为字符串列表之后,就可以开始创建函数了。顺便说一句,我在列表周围使用了一个名为tqdm的漂亮模块,因此一旦应用归一化过程,我们就会获得漂亮的进度条。以下是所需的导入:

from symspellpy.symspellpy import SymSpell, Verbosity
import pkg_resources
import re, string, json
import spacy
from tqdm import tqdm
#Or, for jupyter notebooks:
#from tqdm.notebook import tqdm

删除重复的空白和重复的标点符号(和网址):

   这一步骤用简单的正则表达式替换完成。有改进的余地,但是可以满足我们的期望(这样,我们就不会有多种尺寸的标度和感叹号标记)。我们删除网址,因为这会减少很多我们拥有的不同令牌的数量(我们首先这样做,因为标点替换可能会阻止它)。

def simplify_punctuation_and_whitespace(sentence_list):
     norm_sents = []
     print("Normalizing whitespaces and punctuation")
     for sentence in tqdm(sentence_list):
         sent = _replace_urls(sentence)
         sent = _simplify_punctuation(sentence)
         sent = _normalize_whitespace(sent)
         norm_sents.append(sent)
     return norm_sents
def _replace_urls(text):
     url_regex = r'(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]+\.[^\s]{2,}|www\.[a-zA-Z0-9]+\.[^\s]{2,})'
     text = re.sub(url_regex, "<URL>", text)
     return text
def _simplify_punctuation(text):
     """
   This function simplifies doubled or more complex punctuation. The exception is '...'.
   """
     corrected = str(text)
     corrected = re.sub(r'([!?,;])\1+', r'\1', corrected)
     corrected = re.sub(r'\.{2,}', r'...', corrected)
     return corrected
def _normalize_whitespace(text):
     """
   This function normalizes whitespaces, removing duplicates.
   """
     corrected = str(text)
     corrected = re.sub(r"//t",r"\t", corrected)
     corrected = re.sub(r"( )\1+",r"\1", corrected)
     corrected = re.sub(r"(\n)\1+",r"\1", corrected)
     corrected = re.sub(r"(\r)\1+",r"\1", corrected)
     corrected = re.sub(r"(\t)\1+",r"\1", corrected)
     return corrected.strip(" ")


目录
相关文章
|
1月前
|
机器学习/深度学习 自然语言处理 API
如何使用阿里云的语音合成服务(TTS)将文本转换为语音?本文详细介绍了从注册账号、获取密钥到编写Python代码调用TTS服务的全过程
如何使用阿里云的语音合成服务(TTS)将文本转换为语音?本文详细介绍了从注册账号、获取密钥到编写Python代码调用TTS服务的全过程。通过简单的代码示例,展示如何将文本转换为自然流畅的语音,适用于有声阅读、智能客服等场景。
221 3
|
1月前
|
数据采集 机器学习/深度学习 数据挖掘
利用Python进行高效的数据清洗与预处理
在数据科学和机器学习项目中,数据清洗与预处理是至关重要的一步。本文将介绍如何使用Python中的Pandas库进行高效的数据清洗与预处理。我们将探讨如何处理缺失值、异常值、重复数据,以及如何进行数据类型转换和特征工程。此外,还将介绍一些实用的技巧来优化数据处理的性能。
|
1月前
|
机器学习/深度学习 自然语言处理 知识图谱
GraphRAG在自然语言处理中的应用:从问答系统到文本生成
【10月更文挑战第28天】作为一名自然语言处理(NLP)和图神经网络(GNN)的研究者,我一直在探索如何将GraphRAG(Graph Retrieval-Augmented Generation)模型应用于各种NLP任务。GraphRAG结合了图检索和序列生成技术,能够有效地处理复杂的语言理解和生成任务。本文将从个人角度出发,探讨GraphRAG在构建问答系统、文本摘要、情感分析和自动文本生成等任务中的具体方法和案例研究。
75 5
|
1月前
|
自然语言处理 Python
如何使用自然语言处理库`nltk`进行文本的基本处理
这段Python代码展示了如何使用`nltk`库进行文本的基本处理,包括分词和词频统计。首先需要安装`nltk`库,然后通过`word_tokenize`方法将文本拆分为单词,并使用`FreqDist`类统计每个单词的出现频率。运行代码后,会输出每个词的出现次数,帮助理解文本的结构和常用词。
|
1月前
|
人工智能 自然语言处理 语音技术
利用Python进行自然语言处理(NLP)
利用Python进行自然语言处理(NLP)
43 1
|
2月前
|
人工智能 自然语言处理 语音技术
利用Python进行自然语言处理(NLP)
利用Python进行自然语言处理(NLP)
32 3
|
2月前
|
自然语言处理 算法 数据挖掘
探讨如何利用Python中的NLP工具,从被动收集到主动分析文本数据的过程
【10月更文挑战第11天】本文介绍了自然语言处理(NLP)在文本分析中的应用,从被动收集到主动分析的过程。通过Python代码示例,详细展示了文本预处理、特征提取、情感分析和主题建模等关键技术,帮助读者理解如何有效利用NLP工具进行文本数据分析。
55 2
|
4月前
|
数据可视化 Python
通过python建立一个web服务查看服务器上的文本、图片、视频等文件
通过python建立一个web服务查看服务器上的文本、图片、视频等文件
78 0
|
自然语言处理 Python
Python读取Word/PPT文件文本内容和图片内容
读取某个指定路径下的Word/PPT文件,并将其中所有的文本内容生成一个TXT文件,将所有的图片内容保存在一个文件夹里
396 0
|
存储 Linux 测试技术
Python操作PDF-文本和图片提取(使用PyPDF2和PyMuPDF)
Python操作PDF-文本和图片提取(使用PyPDF2和PyMuPDF)
1147 0
下一篇
DataWorks