在当今数字化时代,人类通过语言进行沟通,产生了大量文本数据,这些数据包括评论、建议、反馈、社交媒体等。这些文本数据中蕴含着丰富的信息,企业尝试应用各种机器学习或深度学习模型来挖掘这些数据中的有价值信息。文本预处理是将原始非结构化文本数据转换为适合进一步处理的格式,以便机器学习算法能够应用到这些数据上。
文本预处理的必要性在于,如果不对文本数据进行预处理,那么基于这些数据构建的算法输出将毫无意义,不会对业务有任何价值。就像俗话说的“垃圾进,垃圾出”,如果输入数据是无用的,那么输出结果也将是无用的。机器学习算法无法理解非结构化文本,因此需要对文本数据进行处理,使其能够被各种自然语言处理(NLP)算法所使用。有时,非结构化文本数据中包含噪声,也需要进行处理。这种将文本数据标准化,使其能够被机器学习算法使用的过程,被称为文本预处理。
客户的文本数据总是混乱且含有噪声的。因此,需要掌握文本预处理的知识。文本预处理的方法多种多样,将学习一些著名的步骤。
Python提供了lower()
函数来将文本数据转换为小写。将文本数据转换为小写很重要,因为不希望机器学习算法将"Laptop"、"LAPTOP"和"laptop"视为三个不同的词。
text = "LAPTOP, laptop and Laptop"
print("Output without lower function:", text)
text_lower = text.lower()
print("Output of lower function:", text_lower)
在许多情况下,数字字符对文本的上下文没有太多价值,因此将其移除。下面的代码1将所有非字母字符(如数字和特殊字符)替换为空白,而代码2只将数字替换为空白。
import re
text = "I ate 4 chapati and 5 idlis. I am still hungry. I will buy 3 burgers and 2 pizzas."
# Code 1 - Removing non-alphabetical characters from text
text_char = re.sub('[^A-Za-z]', ' ', text)
print(text_char)
# Code 2 - Removing only numbers from text
text_d = re.sub('\d+','',text)
print(text_d)
在体育领域的公司,例如cricbuzz,不希望从文本中排除数字,因为球员的统计数据对句子的上下文非常重要。在这种情况下,需要以不同的方式处理数字,而不是简单地移除它们。使用inflect库,可以将数字转换为单词。
import inflect
ie = inflect.engine()
text = "Virat Kohli is number 1 batsman in ODI rankings. He was number 2 long way back and I believe his rating points will range between 908 to 928 in future"
text_old = re.sub('\d+','',text)
print(text_old)
split = text.split()
new = []
for i in split:
if i.isdigit():
word = ie.number_to_words(i)
new.append(word)
else:
new.append(i)
print(new)
移除标点符号很重要,因为它们对文本的信息或含义贡献不大。通过移除它们,可以减少数据的大小,同时提高计算速度。停用词是语言中最常用的词。例如,在英语中,“is”、“am”、“the”、“how”、“to”等都是停用词。这些词比其他词传达的意义要少,因此移除它们可以帮助更多地关注文本中的重要关键词。在这里使用了NLTK库来移除停用词。也可以根据自己的需求创建一个自定义的停用词列表。
# Remove Punctuations
import string
text = "What!! I won an iPad?? Are you kidding??? I cannot believe it !!!"
nopunc = str.maketrans('', '', string.punctuation)
print(text.translate(nopunc))
# Tokenization and removing of stopwords
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize as wt
nltk.download('stopwords')
nltk.download('punkt')
text = "I am a very quick learner. Do you want to learn from them? They are providing classes and study materials."
sw = set(stopwords.words("english"))
token = wt(text)
new = []
for i in token:
if i not in sw:
new.append(i)
print(new)
词干提取有助于找到词的根。通过移除前缀或后缀,将创建词干。词干提取的输出可能是一个实际的词,也可能不是。例如,“run”、“running”、“runs”被提取为“run”。Porter词干提取器是最常用的词干提取器。其他词干提取器包括Snowball和Lancaster。
import nltk
import warnings
warnings.filterwarnings('ignore')
from nltk.stem import wordnet
from nltk.stem.porter import PorterStemmer
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize as wt
nltk.download('wordnet')
nltk.download('stopwords')
nltk.download('punkt')
stemmer = PorterStemmer()
lem = wordnet.WordNetLemmatizer()
text = "I am going to buy a car, I got a lot of suggestions and I am still confused which one to buy"
sw = set(stopwords.words("english"))
tokens = wt(text)
new = []
for i in tokens:
if i not in sw:
new.append(stemmer.stem(i))
print("Output of stemming:", new)
new_l = []
for i in tokens:
if i not in sw:
new_l.append(lem.lemmatize(i, pos ='v'))
print("Output of lemmatization:", new_l)
import nltk
from nltk.tokenize import word_tokenize as wt
from nltk import pos_tag as pt
nltk.download('averaged_perceptron_tagger')
text = 'I love my black little pug. His name is blacky. He loves to run'
token = wt(text)
gm = "NP: {?*}"
pos = pt(token)
cp = nltk.RegexpParser(gm)
tree = cp.parse(pos)
for i in tree.subtrees():
print(i)
import nltk
from nltk.tokenize import word_tokenize as wt
from nltk import pos_tag as pt, ne_chunk
nltk.download('maxent_ne_chunker')
nltk.download('words')
text = 'My name is Bond, James Bond. I am from England'
token = wt(text)
pos = pt(token)
print(ne_chunk(pos))