NLP简化:第一部分-文本清洁和预处理

欢迎来到自然语言处理(nlp)的奇妙世界,计算机越来越擅长理解我们说的话。

你是否曾想过计算机是如何理解人类语言的?答案就在于一个特殊的秘密:nlp。

大多数nlp模型与我们对话自如,这多亏了仔细的文本处理。在本文中,我们将讨论nlp在这方面所采取的关键步骤。

我们将讨论标点符号、特殊字符、停用词、词干提取,甚至是词形还原等等。从分解句子到修正拼写错误,我们在这里让这些概念易于理解。

但这还不是全部——我们还将深入探讨更复杂的主题,比如处理数字、明确缩写和处理棘手的html标签。我们的文章的每一部分都将向您展示nlp发光发热的隐藏工作。准备好学习文本清洗和预处理如何以您从未想象过的方式发挥nlp的奇妙之处。

什么是nlp?

自然语言处理(nlp)是将计算机科学、人类语言和人工智能结合起来的一种技术。它的目标是为计算机制定特殊的指令和工具,以便它们能够理解、解释和生成人类语言。

nlp利用计算机科学和人工智能的方法来帮助计算机理解单词和句子的含义,就像我们一样。这有助于计算机更好地与我们交流,更像真实的对话。这个特殊领域产生了一些有趣的事物,比如翻译语言,有用的聊天机器人和理解文本中的情感。这是技术和语言的交汇处。

例如,nlp在以下方面很有用:

  • 问答聊天机器人
  • 音频移动/电脑锁
  • 语音识别
  • 电子邮件中的垃圾邮件检测
  • 摘要

自然语言处理(natural language processing,nlp)有两个关键方面:

  1. 自然语言理解(natural language understanding,nlu)着重教导计算机理解和解释人类语言。nlu算法帮助计算机“理解”人们所说或写的内容。nlu帮助计算机抓住语言的意义、上下文和结构,从而使其能够准确有效地回应。
  2. 自然语言生成(natural language generation,nlg):nlg旨在让计算机产生类似人类的文本。nlg算法将结构化数据或信息转化为可读、连贯的句子或段落。就像教计算机写作!nlg利用模式和规则来生成自然易懂的内容。

nlp中的基本术语

  • 语料库(corpus):它是一个包含大量文本文档(如新闻、推文、信息等)的集合。它对计算机的学习很有用。例如,语料库包含文档(文档1、文档2、文档3……)
  • 文档(document):文档由不同段落组成。
  • 标记和标记化(token and tokenization):标记是句子的较小部分,标记化是将句子转换为标记的过程。例如,假设这是一个句子:“我的名字是sanket”。因此,在标记化后,我们将得到[“my”,“name”,“is”,“sanket”]。
  • 吗啡(基本词):没有前缀和后缀的最小有意义的词。例如:“不舒服”:“不”+“舒适”+“能够”。所以,这里我们的基本词是“舒适”。

现在,让我们探索文本清理中的每个步骤和技术!

文本清理技术

去除噪声实体

去除噪声实体是自然语言处理中的关键步骤,它识别并从文本数据中删除不相关或无意义的实体。

通过消除通用术语、符号和无关的名称等实体,文本变得更加聚焦和准确,增强了情感分析和命名实体识别等自然语言处理任务的质量。这个过程确保分析基于有意义的内容,摆脱了分散注意力或不重要的因素。

a] 去除特殊字符和标点符号:

这个过程的一部分是清除特殊字符和标点符号。这些不是正常字母和符号,如笑脸或外文字母。它们还包括那些帮助句子看起来有条理的点、逗号和标点。

这里有一个重要原因——这些字符和标记可能会使阅读单词变得棘手。它们可能会让试图理解单词或弄清楚其含义的机器感到困惑。因此,我们将它们去掉,以确保机器更好地理解单词并能够完成它们的工作,比如弄清单词的含义或了解人们的书面情感。

通常去除的一些特殊字符和标点符号的示例包括:

|#’”,。% & ^ * !@ () _ + = – [] $ > { } `~;:/?<

这是一个python代码,可以让您了解如何从文本中删除标点符号:

import nltk

from nltk.tokenize import word_tokenize

nltk.download('punkt')  #下载punkt分词器


# 定义函数
def remove_punctuation(text):

    words = word_tokenize(text)  #将文本分词成单词

    words_without_punct = [word for word in words if word.isalnum()]  #仅保留字母数字单词

    clean_text = ' '.join(words_without_punct)  #将单词连接成一个干净的文本

    return clean_text


# 带标点符号的示例输入文本

input_text = "hello, everyone! how are you?"

# 使用nltk删除标点符号

cleaned_text = remove_punctuation(input_text)


print("输入文本:",input_text)

print("清理后的文本:",cleaned_text)

输出:

输入文本:hello, everyone! how are you?

清理后的文本:hello everyone how are you

b] 停用词去除:

停用词是我们经常使用的常见词,如“the”,“and”,“is”和“in”,它们经常出现在语言中,但本身没有重要的意义。由于自然语言处理的目标是从文本数据中揭示有意义的见解,因此删除停用词至关重要。停用词可能会影响文本分类、情感分析和主题建模等任务,引入不必要的复杂性,可能会扭曲结果。

为了增强自然语言处理任务的效果,使用了各种方法来识别和去除停用词。一种常见的方法是利用针对特定语言的预定义停用词列表。这些列表包含通常被认为具有较少语义价值的单词。自然语言处理库,如python中的nltk或spacy,提供了内置的停用词列表,可以用于此目的。

import nltk

from nltk.corpus import stopwords

nltk.download('punkt')

nltk.download('stopwords')


# 更多停用词的示例句子

sentence = 'there are so many movies in the world, but few of them were able to win oscar'


# 对句子进行分词

words = nltk.word_tokenize(sentence)


# 加载英文停用词

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


# 去除停用词

filtered_words = [w for w in words if w.lower() not in stop_words]


print("原始句子:", sentence)

print("去除停用词后:", " ".join(filtered_words))

输出结果:

原始句子: there are so many movies in the world, but few of them were able to win oscar.

去除停用词后: many movies world, few able win oscar.

让我们继续进行拼写纠正!

c] 拼写检查和纠正:

拼写检查在文本清理中起着至关重要的作用,它可以识别和纠正书面内容中的拼写错误。不准确的拼写可能会造成混淆,并对文本的可信度产生负面影响。自动化的拼写检查确保文本没有错误,并有效地传达预期的信息。在包括沟通、内容创作和数据分析在内的各个领域,准确的拼写对于保持专业性和确保准确分析至关重要。

有多种技术可用于自动拼写校正。一种常见的方法是使用预先构建的字典或语言模型,其中包含正确拼写的单词列表。

from spellchecker import spellchecker


# 创建一个spellchecker对象

spell = spellchecker()


# 包含拼写错误的示例文本

text = "i havv a gret idea to improov the efficiensy of our process."


# 对文本进行分词

words = text.split()


# 查找和纠正拼写错误的单词

corrected_words = [spell.correction(word) for word in words]


# 将纠正后的单词连接起来形成纠正后的文本

corrected_text = " ".join(corrected_words)


print("原始文本:", text)

print("纠正后的文本:", corrected_text)

输出:

原始文本: i havv a gret idea to improov the efficiensy of our process.

纠正后的文本: i have a great idea to improve the efficiency of our process.

现在,我们将了解如何处理nlp中的数值:

d] 处理数值和命名实体:

数字和日期信息是自然语言文本中常见的数据类型。它们可以包含重要的信息,如数量、测量、价格、日期、时间、持续时间等。

例如,数字1000可以在不同的上下文中写成“一千”、“1,000”、“1k”、“103”或“千”。

为了克服这些挑战,自然语言处理系统需要使用一些策略来编码或规范化数字和日期数据。编码意味着将数据转换为适合处理或分析的表示形式。规范化意味着将数据转换为标准或一致的形式,更容易进行比较或操作。

克服这些挑战的策略:

分词:将文本分割为词、数字、符号和标点等较小的单位。它有助于识别文本中的数字和日期数据。(如前所述)

解析:使用语法和逻辑分析文本结构和含义。它可以澄清数字和日期数据的上下文,解决歧义。

转换:为了一致性而改变数字和日期格式。它使用通用系统标准化信息。

提取:通过模式或规则识别和隔离数字和日期数据。它捕获用于分析或处理的相关信息。

这段代码将使用正则表达式提取数字值。我们使用dateutil库来提取数据:

import re

from dateutil.parser import parse


# 保留html标签的英文文本

text = "sales for the year 2023 reached $100,000 on 2023-08-31."


# 使用正则表达式提取数字信息

numerical_entities = [int(match) for match in re.findall(r'd+', text)]


# 使用dateutil库提取日期信息

date_entities = parse(text, fuzzy_with_tokens=true)[0]


print("数字实体:", numerical_entities)

print("日期实体:", date_entities)

输出:

数字实体: [2023, 100000, 2023, 08, 31]
日期实体: 2023-08-31 00:00:00

这样我们就可以从文本中提取数字实体。

e] 处理缩略词和缩写:

当我们将词语缩短为“i'm”变为“i am”或“nlp”变为“自然语言处理”时,这就是缩略词和缩写。将它们展开对于nlp系统非常重要。它有助于清理文本,使其更容易理解,避免任何混淆或困惑。扩展缩略词和缩写可以帮助:

  1. 增强一致性和nlp模型的性能。
  2. 减少内存使用和计算负载。
  3. 消除歧义并保持情感。
  4. 可以使用包括词典、规则和机器学习在内的各种方法来扩展缩略词和缩写,每种方法都有其优点和注意事项。

处理缩略词和缩写的方法:

  • 基于词典
  • 基于语法
  • 基于机器学习

简单的基于字典的方法:

这段代码扩展了缩写和缩写。

# 带缩写和缩写的示例文本

text = "我很高兴见到你,迫不及待地讨论自然语言处理。"


# 含义的缩写字典

contraction_dict = {

    "我很": "我是",

    "不能": "不能"

    # 根据需要添加更多的缩写和它们的扩展

}


# 扩展缩写的函数

def expand_contractions(text, contraction_dict):

    words = text.split()

    expanded_words = [contraction_dict.get(word, word) for word in words]

    expanded_text = " ".join(expanded_words)

    return expanded_text

expanded_text = expand_contractions(text, contraction_dict)


print("原始文本:", text)

print("扩展文本:", expanded_text)

输出:

原始文本:我很高兴见到你,迫不及待地讨论自然语言处理。

扩展文本:我是很高兴见到你,不能等待讨论自然语言处理。

我们可以根据需要添加或删除缩写和缩写。

f] 处理html标签和标记:

html标签写在尖括号()内,通常成对出现,例如

为了处理文本数据中的html标签,我们可以使用一些技术来剥离html标签并保留文本内容。剥离html标签意味着从文本数据中删除或替换html标签,而保留文本内容意味着保留或获取文本数据中的纯文本。

处理html标签的技术:

正则表达式:快速删除html标签,但如果标签复杂,可能不准确。

html解析器:准确理解标签,但可能速度较慢且更复杂。

网页抓取器:轻松从网页获取纯文本,但可用性可能有限。

下面是使用beautifulsoup来实现这个的代码:

from bs4 import beautifulsoup

import requests

import re


# 要提取文本的网页的url

url = "https://www.example.com"  # 用实际的url替换


# 从网页获取html内容

response = requests.get(url)

html_content = response.content


# 创建一个beautifulsoup对象

soup = beautifulsoup(html_content, 'html.parser')


# 使用正则表达式删除html标签

cleaned_text = re.sub(r'', '', soup.get_text())


print("原始html:")

print(html_content)

print("n清理后的文本(没有html标签):")

print(cleaned_text)

要运行上述代码,您需要将“https://www.example.com”替换为实际链接。借助beautifulsoup,您将从该网站获取内容。在网页抓取后,您将使用正则表达式删除html标签。

现在,让我们来看看文本预处理。

文本预处理

在任何自然语言处理项目中,初始任务是文本预处理。预处理涉及将输入文本组织成一致且可分析的格式。这一步对于创建出色的自然语言处理应用程序至关重要。

有不同的方法来预处理文本:

  • 分词
  • 标准化
  • 归一化

其中,最重要的步骤之一是标记化。标记化涉及将文本数据序列分割成单词、术语、句子、符号或其他有意义的组件,即标记。有许多开源工具可用于执行标记化过程。

标记化

标记化是任何nlp过程的初始阶段,并且对整个流程产生重大影响。通过使用标记器,非结构化数据和自然语言文本被分割成可管理的片段。这些片段被称为标记,可以作为独立的组件处理。在文档中,可以利用标记的频率创建表示文档的向量。

这种快速转换将原始的非结构化字符串(文本文档)转换为适用于机器学习的数值结构。标记具有直接指导计算机启动有价值的操作和响应的潜力。或者,它们可以在机器学习序列中作为属性,引发更复杂的决策或行为。

标记化涉及将文本分割成句子、单词、字符或子词。当我们将文本分割成句子时,它被称为句子标记化。另一方面,如果我们将其分解成单词,则被称为单词标记化。

有不同类型的标记化:

句子标记化的示例:

sent_tokenize(“my favorite movie is free guy”)

–> [“my favorite movie is free guy”]

单词标记化的示例:

word_tokenize(“elon musk is a businessman”)

–> [“elon”, “musk”, “is”, “a”, “businessman”]

a] 空格分词

最简单的分词形式是在空格或空白处分割文本。就像将一个句子在空隙处切成几段。虽然这种方法很直接,但可能无法有效处理标点符号或特殊情况。

空格分词的示例:

“自然语言处理很棒!”

–> [“自然”, “语言”, “处理”, “很棒!”]。

b] 正则表达式分词

正则表达式分词使用模式来定义在何处将文本分割为标记。这比简单的空格分割更精确地进行分词,可以更好地处理标点符号和特殊情况。

正则表达式分词的示例:

“给我发电子邮件:[email protected]。”

–> [“给我”, “发”, “电子邮件”, “:”, “jack”, “.”, “sparrow”, “@”, “blackpearl”, “.”, “com”, “.”]

c] 单词和子词分词

这种方法专注于将标点符号保留为单独的标记。在情感分析等需要保持标点符号含义的场景中特别有用。

子词分词将单词分解为更小的有意义的单元,例如音节或词的部分。对于结构复杂的语言特别有帮助。

单词分词的示例:

“哇!这真是令人难以置信。”

–> [“哇”,“!”,“这是”,“令人难以置信”,“。”]

子词标记化的示例:

“难以置信”

–> [“难以”, “置信”]

d] 字节对编码 (bpe) 标记化

字节对编码是一种子词标记化技术,它根据词的出现频率将单词分割成较小的单元。这对处理罕见或词汇表外的单词特别有用。

e] 树库标记化

树库标记化使用基于语言约定的预定义规则对文本进行分词。它考虑到诸如缩略词和连字符词等因素。

示例:“我不敢相信今天是8月23日!”

–> [“我”, “can”, “‘t”, “believe”, “it”, “‘s”, “august”, “23rd”, “!”].

这些就是标记化的类型。现在,我们将转向标准化文本。

标准化文本

小写和大写

标准化文本大小写意味着将文本转换为相同的大小写,通常是小写,以便于处理和分析。标准化文本大小写涉及将文本中的所有字母都变成相同的大小写,通常是小写,以便更容易处理。这在分析语言等方面很有用,我们使用计算机来理解单词和句子。当我们这样做时,就像整理文本,使计算机更好地理解。

这样做有助于使文本更一致,并消除歧义。例如,如果我们计算单词出现的频率,我们希望“apple”和“apple”被视为相同的东西。我们不希望计算机将它们视为不同的单词,仅仅因为它们的大小写不同。这就像公平对待所有单词一样!

但有时我们不遵循这个规则。有时,大写字母很重要。例如,在计算机术语中,我们有必须保持不变的东西的名称,比如“uk”或“nasa”。此外,如果有人用大写字母写作,比如“stop!”或“sos”,这意味着不同的含义或者他们可能在表达他们的情绪。

另一件要知道的事情是不同的写作风格存在。有时在计算机代码中,单词是joinedlikethisseparated_by_underscores.

简而言之,标准化文本大小写就像给文本修剪一个漂亮的发型,以便计算机可以理解它。但请记住,有特殊情况我们会基于特殊原因而打破规则。

这段代码通过将单词转换为小写来检查两个单词“apple”和“apple”是否相同。如果相同,它将打印它们相同;否则,它将打印它们不同。

# 标准化文本大小写

word1 = "apple"

word2 = "apple"


# 将单词转换为小写

word1_lower = word1.lower()

word2_lower = word2.lower()


# 比较标准化的单词

if word1_lower == word2_lower:

    print("当不考虑大小写时,这两个单词相同。")

else:

    print("当不考虑大小写时,这两个单词不同。")

输出:

当不考虑大小写时,这两个单词相同。

让我们向正常化方向前进。

正常化

标准化是将标记转换为其基本形式的过程。在标准化中,将从单词中去除屈折形式,以获得其基本形式。

标准化的目的是减少文本中不带有重要含义但可能影响自然语言处理任务准确性的变异。使用不同形式的标准化来解决文本处理中的特定挑战。

例如:

am, are, is => be

cat, cats, cat’s, cats’ => cat

让我们将映射应用于以下句子:

all of the don’s cats are different colors => all of the don cat be different color

在自然语言处理中,有一些常用的标准化方法。

  • 词干提取
  • 词形还原

a] 词干提取

在深入了解词干提取之前,让我们先熟悉一下术语“词干”。将单词的额外部分添加到词干上时,称之为屈折,这样我们就可以创建新单词。

词干是从词中去除前缀和后缀后剩下的词。有时,词干提取可能会产生不在字典中或没有意义的词。因此,在各种任务中,词干提取不如词形还原技术好。

例如- “quickly”, “quicker”, “quickest”

词干化后的单词- “quickli”(不是字典中的单词)

例如- “frogs are dancing and dogs are singing.”

词干化的标记:[‘frog', ‘are', ‘danc', ‘and', ‘dog', ‘are', ‘sing']

过度词干化:词干化的字母过多,或者多个词干映射到同一个单词,导致原始含义丢失。

ex-“计算机”,“计算”,和“计算” –> “计算”

在词干提取下:检查这个例子

ex-“跳跃”,“跳跃过”,和“跳跃” –> “跳跃”,“跳跃过”,和“跳跃”。

这里这三个词应该被提取为基本词‘跳’,但是算法没有捕捉到。

nltk的词干提取器类型:

  • porterstemmer,
  • lancasterstemmer,
  • snowballstemmer等。

我们使用了这三个词干提取器(porterstemmer,lancasterstemmer,snowballstemmer)进行词干提取。它将句子分解为单个单词,然后尝试三种不同的方式将单词缩短到最短,并打印提取出的词元进行比较。

import nltk

from nltk.stem import porterstemmer, lancasterstemmer, snowballstemmer

from nltk.tokenize import word_tokenize

nltk.download('punkt')


# sample sentence

sentence = "青蛙在跳舞和狗在唱歌."

tokens = word_tokenize(sentence)


# stemmers

stemmers = [porterstemmer(), lancasterstemmer(), snowballstemmer("english")]

for stemmer in stemmers:
    stemmed_tokens = [stemmer.stem(token) for token in tokens]
    print(f"{stemmer.__class__.__name__} 提取的词元:", stemmed_tokens)

输出:

porterstemmer 提取的词元: ['青蛙', '在', '跳舞', '和', '狗', '在', '唱歌', '.']

lancasterstemmer 提取的词元: ['青蛙', '在', '跳舞', '和', '狗', '在', '唱歌', '.']

snowballstemmer 提取的词元: ['青蛙', '在', '跳舞', '和', '狗', '在', '唱歌', '.']

还有很多其他的库可以做同样的事情。现在,让我们尝试理解什么是词形还原:

b] 词形归并

词形归并与词干提取相似,只有一点不同。词形归并将单词转换为有意义的基本形式。词形归并是根据词汇和语法关系获取单词基本形式的过程。

词形归并是将单词改变为其基本或正常形式(称为词元)的方式。例如,单词“cats”的正常形式是“cat”,而“running”的正常形式是“run”。

词形归并需要知道句子中单词的正确词性和意义,以及该句子周围的更大情境。与截断词尾不同,词形归并试图根据情境选择正确的正常形式。

您可以根据需要选择以下任何词形归并器:

  • wordnet词形归并器
  • spacy词形归并器
  • textblob
  • clips pattern
  • stanford corenlp
  • gensim词形归并器
  • treetagger

我们将使用nltk库来使用wordnetlemmatizer执行词形归并。它首先对句子进行分词,然后进行词形归并,以从词汇中找到有意义的基本词汇,然后将它们放回并打印词形归并后的句子。

import nltk

from nltk.stem import wordnetlemmatizer

from nltk.tokenize import word_tokenize

nltk.download('punkt')

nltk.download('wordnet')


# 创建一个词形还原器对象

lemmatizer = wordnetlemmatizer()


# 示例句子

sentence = "男孩正在奔跑,蚊子在飞翔。"


# 对句子进行分词

tokens = word_tokenize(sentence)


# 对分词进行词形还原

lemmatized_tokens = [lemmatizer.lemmatize(token) for token in tokens]


# 将词形还原后的分词拼接成句子

lemmatized_sentence = " ".join(lemmatized_tokens)


print("原始句子:", sentence)

print("词形还原后的句子:", lemmatized_sentence)

输出:

原始句子: 男孩正在奔跑,蚊子在飞翔。

词形还原后的句子: 男孩 正 在 奔跑 , 蚊子 在 飞翔 。

现在,是时候结束了!

结论

在本文中,我们探讨了自然语言处理(nlp)的基础知识。我们了解了nlp在各个领域的重要性,并从清理和准备文本开始我们的旅程。我们讨论了去除特殊字符、对文本进行分词等内容。我们还了解了规范化、词干提取、词形还原以及处理数字和日期的概念。此外,我们还初步了解了处理html内容的方法。

然而,我们的旅程还在继续。还有一整个世界的高级文本清理方法等待我们去探索。我们将深入了解词性标注,探索不同的工具和库,并进行令人兴奋的nlp项目。本文只是个开始;请准备好迎接第二部分,更多的知识等待着你。

如果你想学习自然语言处理,这里有一些最佳的nlp课程

类似文章