关于NLP中的文本预处理的完整教程

在任何数据科学项目的生命周期中,清理和预处理数据是最重要的性能方面。比方说,如果你正在处理非结构化文本数据,这在所有的数据中是很复杂的,而你进行同样的建模,会发生两件事。要么你会出现一个大错误,要么你的模型不会像你预期的那样表现。你可能已经想知道现代的语音协助系统,如谷歌协助、Alexa、Siri是如何理解、处理和回应人类语言的,所以这里有一个重头戏,即自然语言处理。

自然语言处理,NLP,是一种来自计算机科学和人工智能帮助下的数据语义分析的技术。它基本上是一种从原始数据中提取有意义的信息的艺术,其目的是在自然语言和计算机之间建立相互联系,这意味着对大量的自然语言数据进行分析和建模。通过利用NLP的力量,现实世界中的商业问题可以得到解决,如总结文件、标题生成器、标题生成器、欺诈检测、语音识别和重要的是,神经机器翻译等等。

文本处理是NLP下使用的一种方法,用于清理文本并为建立模型做准备。它用途广泛,包含各种形式的噪音,如情感、标点符号和以数字或特殊字符形式书写的文本。我们必须处理这些主要问题,因为机器不会理解它们只问数字。从文本处理开始,某些用Python编写的库简化了这一过程,其简单明了的语法提供了很大的灵活性。第一个是NLTK,代表自然语言工具箱,对所有的任务都很有用,如词干化、POS、标记化、词法化等等。

你可能知道缩略语;没有任何一个句子是没有缩略语的,这意味着我们每次都倾向于以一种方式使用单词,如did't而不是did not,那么当我们对这些单词进行标记时,会发生什么情况呢,它会以'did''t'的形式出现,而对这些单词没有任何办法。为了处理这样的词,有一个叫做缩略语的库。BeautifulSoup是一个用于网络搜刮的库,但有时我们倾向于获得带有HTML标签和URL的数据,为了处理这个问题,BeautifulSoup被使用。而为了将数字转换成文字,我们使用了inflect库。

实现文本预处理

在下面的python代码中,我们从Twitter情感分析数据集的原始文本数据中去除噪音。之后,我们将进行删除停顿词、干化和词法处理。

导入所有的依赖性。
! pip install contractions
import nltk
import contractions
import inflect
from nltk import word_tokenize, sent_tokenize
from nltk.corpus import stopwords
from nltk.stem import LancasterStemmer, WordNetLemmatizer
from bs4 import BeautifulSoup
import re, string, unicodedata
复制代码
去除噪音。

第一步是去除数据中的噪音;在文本领域,噪音是指与人类语言文本无关的东西,这些东西具有各种性质,如特殊字符、小括号的使用、方括号的使用、空白、URL和标点符号。

下面是我们正在处理的样本文本。

正如你所看到的,首先有许多HTML标签和一个URL;我们需要删除它们,为此,我们使用BeautifulSoup。下面的代码片段将这两者都删除了。

# to remove HTML tag
def html_remover(data):
  beauti = BeautifulSoup(data,'html.parser')
  return beauti.get_text()

# to remove URL
def url_remover(data):
  return re.sub(r'https\S','',data)

def web_associated(data):
  text = html_remover(data)
  text = url_remover(text)
  return text

new_data = web_associated(data)
复制代码

在去除HTML标签和URL后,仍有一些标点符号和空白的噪音,以及括号内的文本数据;这也需要被处理。

def remove_round_brackets(data):
  return re.sub('\(.*?\)','',data)

def remove_punc(data):
  trans = str.maketrans('','', string.punctuation)
  return data.translate(trans)

def white_space(data):
  return ' '.join(data.split())

def complete_noise(data):
  new_data = remove_round_brackets(data)
  new_data = remove_punc(new_data)
  new_data = white_space(new_data)
  return new_data

new_data = complete_noise(new_data)
复制代码

现在,正如你所看到的,我们已经成功地去除文本中的所有噪音。

对文本进行规范化处理。

通常情况下,文本规范化首先要对文本进行标记,我们较长的语料现在要被分割成若干个词块,NLTK的标记器类可以做到这一点。之后,我们需要对语料库中的每个单词进行小写,将数字转换为单词,最后进行缩略语替换。

def text_lower(data):
  return data.lower()

def contraction_replace(data):
  return contractions.fix(data)

def number_to_text(data):
  temp_str = data.split()
  string = []
  for i in temp_str:
    # if the word is digit, converted to 
    # word else the sequence continues
    if i.isdigit():
      temp = inflect.engine().number_to_words(i)
      string.append(temp)
    else:
      string.append(i)
  return temp_str

def normalization(data):
  text = text_lower(data)
  text = number_to_text(text)
  text = contraction_replace(text)
  nltk.download('punkt')
  tokens = nltk.word_tokenize(text)
  return tokens

tokens = normalization(new_data)
print(tokens)
复制代码

现在,我们已经接近基本文本预处理的尾声;现在,我们只剩下一件重要的事情:停止词。在分析文本数据时,停顿词根本没有意义;它只是用于装饰性目的。因此,为了进一步降低维度,有必要将停顿词从语料库中删除。

最后,我们有两种选择,即用词干化或词组化的形式来表示我们的语料库。词干化通常试图将单词转换为其词根格式,而且大多是通过简单地切割单词来进行。而词根化也是做干化的任务,但以适当的方式意味着它将单词转换为词根格式,如'scenes'将被转换为'scene'。人们可以在词干化和词缀化之间进行选择。

def stopword(data):
  nltk.download('stopwords')
  clean = []
  for i in data:
    if i not in stopwords.words('english'):
      clean.append(i)
  return clean

def stemming(data):
  stemmer = LancasterStemmer()
  stemmed = []
  for i in data:
    stem = stemmer.stem(i)
    stemmed.append(stem)
  return stemmed

def lemmatization(data):
  nltk.download('wordnet')
  lemma = WordNetLemmatizer()
  lemmas = []
  for i in data:
    lem = lemma.lemmatize(i, pos='v')
    lemmas.append(lem)
  return lemmas  

def final_process(data):
  stopwords_remove = stopword(data)
  stemmed = stemming(stopwords_remove)
  lemm = lemmatization(stopwords_remove)
  return stemmed, lemm
stem,lemmas = final_process(tokens)
复制代码

下面我们可以看到经过词干化和词缀化的单词。

结语。

在这篇文章中,我们讨论了文本的预处理对模型的建立是如何必要的。从一开始,我们就学会了如何去除HTML标签,并从URL中去除噪音。首先,为了去除噪音,我们必须对我们的语料库进行概述,以定制噪音成分。我们已经观察到在词干化和词条化之间的巨大权衡,我们应该始终使用词条化的词。

参考文献。

The postComplete Tutorial on Text Preprocessing in NLPappeared first onAnalytics India Magazine.

猜你喜欢

转载自juejin.im/post/7086657753749405726
今日推荐