在机器学习任务中,数据的清洗或预处理与模型构建同等重要。文本数据是可用数据中最为非结构化的形式之一,处理人类语言时尤为复杂。是否曾好奇过,Alexa、Siri和Google助手如何理解、处理并回应人类语言?自然语言处理(NLP)技术便是背后的功臣,任何回应之前都会进行大量的文本预处理。本文将探讨在工作中必须了解的主要文本预处理技术。
什么是自然语言?什么是NLP(自然语言处理)?自然语言是人类进行对话所使用的任何语言。NLP是人工智能的一个领域,计算机在此领域中分析、理解并从人类语言中以智能和有用的方式提取有意义的信息。
什么是文本分析/文本挖掘?文本分析是从自然语言文本中提取有意义信息的过程。文本分析不过是在将数据提供给模型之前所需的预处理。
文本预处理有助于去除数据中无用的部分或噪声,通过将所有字符转换为小写、去除停用词、标点符号和数据中的错别字。完成数据预处理后,模型的准确性会得到提高。
1. 转换为小写:知道Python是一种区分大小写的语言。如果数据中同时出现“Ram”和“ram”这两个词,它们会被分别处理,因此需要将所有数据转换为小写。
df['text'].str.lower()
df['text'].apply(lambda x: x.lower())
2. 移除HTML标签:HTML标签在模型构建中并不重要,需要移除它们。可以使用正则表达式来移除HTML标签。
import re
def remove_html_tags(text):
pattern = re.compile('')
return pattern.sub(r'', text)
df['text'].apply(remove_html_tags)
3. 移除URLs:URLs在模型构建中也不重要,需要移除它们。可以使用正则表达式来移除URLs。
def remove_url(text):
pattern = re.compile('https?://S+|www.S+')
return pattern.sub(r'', text)
df['text'].apply(remove_url)
4. 移除标点符号:如果不移除标点符号,那么标点符号也会被视为一个词。在这种情况下,需要移除标点符号。
import string, time
exclude = string.punctuation
def remove_punct(text):
for char in exclude:
text = text.replace(char, '')
return text
如果定义函数,那么它会花费很多时间。maketrans函数会花费较少的时间。
def remove_punct(text):
return text.translate(str.maketrans('','', exclude))
5. 聊天词汇处理:在正常聊天中,使用单词的缩写形式。需要将这种简短形式转换为完整形式。
# 以字典形式添加聊天词汇
chat_words = {}
def chat_conversion(text):
new_text = []
for w in text.split():
if w.upper() in chat_words:
new_text.append(chat_words[w.upper()])
else:
new_text.append(w)
return ' '.join(new_text)
6. 拼写校正:使用TextBlob库进行拼写校正。
from textblob import TextBlob
incorrect_text = 'any tezt with for checing'
textblob = TextBlob(incorrect_text)
7. 移除停用词:停用词仅用于句子构成,但在句子的意义上,停用词并不重要。
from nltk.corpus import stopwords
stopwords.words('english')
8. 处理表情符号:表情符号不被机器学习模型理解。可以使用两种方法来处理表情符号:移除表情符号或用含义替换。
9. 分词:在分词中,将数据分解为标记。可以进行单词分词或句子分词。
sent = 'I am going to Delhi. With my parents.'
1. 使用split函数
sent.split()
2. 使用NLTK库
import nltk
from nltk.tokenize import word_tokenize, sent_tokenize
word_tokenize(sent)
sent_tokenize(sent)
3. 使用Spacy库
import spacy
nlp = spacy.load('en_core_web_sm')
doc1 = nlp(sent)
for token in doc1:
print(token)
10. 词干提取/词形还原:词干提取意味着通过去除前缀或后缀将一组词映射到相同的词干,而不给予词干形成的“语法意义”任何价值。简单地说,词干提取就是从词中去除后缀和前缀。词干提取器是一种执行词干提取的算法。
1. Porter词干提取器——专门用于英语
2. Snowball词干提取器——用于多种语言
3. Lancaster词干提取器
# 从nltk库导入词干提取函数
from nltk.stem.porter import PorterStemmer
# 定义词干提取对象
porter_stemmer = PorterStemmer()
sent = 'History is the best subject for teaching'
tokens = nltk.word_tokenize(sent)
for word in tokens:
print(word, '---->', porter_stemmer.stem(word))
nltk.download('wordnet')
from nltk.stem import WordNetLemmatizer
WordNetLemmatizer = WordNetLemmatizer()
sent = 'History is the best subject for teaching'
tokens = nltk.word_tokenize(sent)
for word in tokens:
print(word, '—>', WordNetLemmatizer.lemmatize(word, pos='v'))