文章目录
1. 前言
NLP是数据科学领域的一个重要的分支,它包含了以一种高效的方式去分析,理解和从文本里提取信息等重要过程。通过利用NLP及其组件,可以组织大量的文本数据,执行大量的自动化任务,并解决各种问题,比如自动摘要,机器翻译,命名实体识别,关系提取,情感分析,语音识别和主题分割等。
在这之前我需要先讲解下一些将会在文章出现的专业术语:
- 符号化—将文本转化成特定的计算机可以识别标记的过程。
- Tokens—文本中存在的单词和实体
- 文本目标–一个句子,一个短语,一个单词或者一篇文章
安装NLTK的过程:
安装Pip:
sudo easy_install pip
安装NLTK:
sudo pip install -U nltk
下载NLTK数据:
import nltk
nltk.download()
2. 文本预处理
由于文本是所有数据中最非结构化的形式,所以存在各种类型的噪音,并且在不进行任何预处理的情况下,不容易分析。清洁和标准化文本,使其无噪声和准备分析的过程称为文本预处理。
这个过程主要由以下三步组成:
- 去噪声
- 词汇归一化
- 目标标准化
2.1 去噪声
只要是和输出没有关系的文本都可以看做噪声。
例如:语言的停用词(is,am, the, of等),URLs, 链接,社交媒体实体,标点符合和行业特定词。这一步主要是移除文本中的噪声因子。
噪声去除的一般方法是编写嘈杂实体的字典,并通过迭代文本对象消除噪声字典中存在的标记。
下面代码python实现的方式:
noise_list=['is','a','this','...']
def _remove_noise(input_text):
words = input_text.split()
noise_free_words=[word for word in words if word not in noise_list]
noise_free_text = " ".join(noise_free_words)
return noise_free_text
_remove_noise("this is a sample text")
>>> "sample text"
另一种方式是在使用特殊噪声模式时使用正则表达式。我们在前面的一篇文章中详细解释了正则表达式。下面python代码从输入文本中移除正则表达式模式:
def _remove_regex(input_text, regrex_pattern):
urls=re.finditer(regex_pattern, input_text)
for i in urls:
input_text = re.sub(i.group().strip,'', input_text)
return input_text
regrex_pattern = "#[\w]*"
_remove_regex("remove this #hashtag from analytic vidhya", regrex_pattern)
>>>>"remove this from analytic vidhya"
2.2 词汇归一化
文本噪声的另一种类型是关于单个单词所表现的多个表示。
例如:“play”,“player”,“played",“plays” 和 ”playing"是“play"的多种表示形式。虽然他们的含义不一样,但是上下文中是相似的。这一步就是要把这些各种形式的单词归一化。归一化是具有文本特征工程的关键步骤,因为它将高纬特征(N个不同特征)转化成低维空间(1特征),这是任何ML模型的理想要求。
最常用的归一化方法是:
- 词干(Steamming):词干是消除后缀的一个基本的基于规则的过程。(“ing”, “ly”, “es”等)
- 词元化(Lemmatization): 词元化是一个有组织性的,逐步地获得词根的过程,他利用词汇(单词的词典重要性)和词法分析(词法结构和词法关系)。
下面就是利用NLTK包的词干提取和词元化的python代码:
from nltk.stem.wordnet import WordNetLemmatizer
lem = WordNetLemmatizer()
from nltk.stem.porter import PorterStemmer
stem = PorterStemmer()
word = "multiplying"
lem.lemmatize(word, 'v')
>>> "multiply"
stem.stem(word)
>>>"multipli"
2.3 目标标准化
文本数据通常包含不存在于任何标准词汇词典中的词或者短语。这些片段不被搜索引擎和模型所识别 。
一些例子是,首字母缩略词,带有附加词的标签和口语哩语。在 正则 表达式和手工编写的数据字典的帮助下,这种类型的噪声可以被固定。下面的代码使用字典查找方法来替代文中的 社交媒体哩语。
look_dict = {
'rt':'Retweet','dm':'direct message','awsm':'awesome','luv':'love','...'}
def _look_words(input_text):
words = input_text.split()
new_words = []
for word in words:
if word.lower() in lookup_dict:
word = lookup_dict[word.lower()]
new_words.append(word)
new_text = " ".join(new_words)