当前位置: 首页 > news >正文

使用 Python 进行自然语言处理第 3 部分:使用 Python 进行文本预处理

一、说明

        文本预处理涉及许多将文本转换为干净格式的任务,以供进一步处理或与机器学习模型一起使用。预处理文本所需的具体步骤取决于具体数据和您手头的自然语言处理任务。

        常见的预处理任务包括:

  • 文本规范化——将文本转换为标准表示形式,例如全部小写。
  • 删除停用词、标点符号、特殊单词或文本片段,例如井号标签、URL、表情符号、非 ASCII 字符等。
  • 词干提取——从文本单词中删除后缀
  • 词形化 - 将单词转化为它们的引理形式(引理是字典中存在的单词的形式)。
  • 拼写更正——更正任何拼写错误
  • 通过绘图进行探索性分析

        NLTK、SpaCy 等库提供内置的文本预处理功能。

二、文本预处理

2.1 文本预处理的好处

  • 降维:包含许多单词的文本文档可以表示为多维向量。文档的每个单词都是向量的维度之一。应用文本处理有助于删除对您所针对的实际 NLP 任务可能没有意义的单词,从而减少数据的维度,这反过来又有助于解决维数灾难问题并提高 NLP 任务的性能。

2.2 文本预处理

        下载到您的计算机并将其加载到 pandas 数据框中。如果使用 read_csv(),请使用编码 = 'latin-1'。数据集有很多列,我们只对这篇关于文本预处理的文章的原始推文列感兴趣。

# Read the dataset into a dataframe
import pandas as pd
train_data = pd.read_csv('Corona_NLP_train.csv',  encoding='latin-1')
train_data.head()# Remove the columns not relevant to Text-Preprocessing Task
train_data = train_data.drop(['UserName', 'ScreenName', 'Location', 'TweetAt', 'Sentiment'], axis = 1)
train_data.columns

2.3 小写转换

#1. Case Conversion to Lower Case
train_data['OriginalTweet'] = train_data['OriginalTweet'].str.lower()
train_data.head()

2.4 删除停用词和标点符号

#Remove stop words and punctuation marks
#https://stackoverflow.com/questions/29523254/python-remove-stop-words-from-pandas-dataframe
import nltk
import string
from nltk.corpus import stopwords
stop_words = stopwords.words('english')
stopwordsandpunct = stop_words + list(string.punctuation)train_data['OriginalTweet'] = train_data['OriginalTweet'].apply(lambda w:' '.join(w for w in w.split() if w not in stopwordsandpunct))
train_data['OriginalTweet']

2.5 删除 URL

# Remove URLs from all the tweets
import re
def remove_url(tweet):tweet = re.sub(r'\w+:\/{2}[\d\w-]+(\.[\d\w-]+)*(?:(?:\/[^\s/]*))*', '', tweet)return tweettrain_data['OriginalTweet'] = train_data['OriginalTweet'].apply(remove_url)
train_data['OriginalTweet'].head()

2.6 删除提及和井号标签

# remove mentions and hashtags
def remove_mentions_hashs(tweet):tweet = re.sub("@[A-Za-z0-9_]+","", tweet) #Remove mentionstweet = re.sub("#[A-Za-z0-9_]+","", tweet) #Remove hashtagsreturn tweettrain_data['OriginalTweet'] = train_data['OriginalTweet'].apply(remove_mentions_hashs)
train_data['OriginalTweet'].head()

2.7 删除表情符号

# Removing emojis from tweets
# Source Credit: https://stackoverflow.com/a/49146722/330558
import re
def remove_emojis(tweet):pat = re.compile("["u"\U0001F600-\U0001F64F"  # emoticonsu"\U0001F300-\U0001F5FF"  # symbols & pictographsu"\U0001F680-\U0001F6FF"  # transport & map symbolsu"\U0001F1E0-\U0001F1FF"  # flags (iOS)u"\U00002702-\U000027B0"u"\U000024C2-\U0001F251""]+", flags=re.UNICODE)return pat.sub(r'', tweet)train_data['OriginalTweet'] =train_data['OriginalTweet'].apply(remove_emojis)
train_data.head()

2.8 删除非 ASCII 字符

#https://docs.python.org/2/library/unicodedata.html#unicodedata.normalize
import unicodedata
def remove_nonascii(text):text = unicodedata.normalize('NFKD', text).encode('ascii', 'ignore').decode('utf-8', 'ignore')# apply compatibility decompositionreturn text
train_data['OriginalTweet'] = train_data['OriginalTweet'].apply(remove_nonascii)
train_data.head()

2.9 删除空字符串

import string
def remove_empty_strings1(tweet):tweet = re.sub(r"^\s+|\s+$", 'NaN', tweet)return tweet
train_data['OriginalTweet'] =train_data['OriginalTweet'].apply(remove_empty_strings1)

2.10 删除主题标签、URL 后删除所有包含 NaN 的行

train_data = train_data[train_data['OriginalTweet'] != 'NaN']# Now resetting index of Data frame
train_data = train_data.reset_index(drop = True)

三、文本内容预处理

3.1 使用 TextBlob 进行拼写更正

# Spelling correction
import warnings
warnings.filterwarnings("ignore")
from textblob import TextBlob   
train_data['SpellCorrectedTweet'] = train_data['OriginalTweet'].apply(lambda x : str(TextBlob(x).correct()))
train_data.head()

3.2 使用 NLTK 的内置 Tokenizer 进行标记化

# Now we will perform tokenization
import nltk
from nltk import word_tokenize
tokenizer = nltk.tokenize.WhitespaceTokenizer()
def tokenize(text):return tokenizer.tokenize(text)train_data['OriginalTweet'] = train_data['OriginalTweet'].apply(tokenize)
train_data['OriginalTweet'].head()

3.3 使用 NLTK 的 WordNetLemmatizer 进行词形还原

import nltk
tokenizer = nltk.tokenize.WhitespaceTokenizer()
lemmatizer = nltk.stem.WordNetLemmatizer()def lemmatize(text):return [lemmatizer.lemmatize(w) for w in text]train_data['OriginalTweet'] = train_data['OriginalTweet'].apply(lemmatize)
train_data.head()

3.4 使用 NLTK 的 PorterStemmer 进行词干提取

# Stemming
from nltk.stem import PorterStemmer
stemmer = PorterStemmer()def stemming(text):return [stemmer.stem(w) for w in text]train_data['OriginalTweet'] = train_data['OriginalTweet'].apply(stemming)
train_data.head()

3.5 计算推文中最常见的单词

# Counting most frequent words in tweets
#https://docs.python.org/3/library/itertools.html#itertools.chain
import itertools
import collections
all_tweets = list(train_data["OriginalTweet"])
all_tokens = list(itertools.chain(*all_tweets))
token_counts = collections.Counter(all_tokens)# Print 10 most common words with their frequency
print(token_counts.most_common(10))# Convert above words and frequencies to a dataframe
df = pd.DataFrame(token_counts.most_common(20), columns=['Token','Count'])
df.head()# Plotting frequencies using Matplotlib barplot
import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = (12,8)
df.sort_values(by = 'Count').plot.bar(x='Token', y='Count')
plt.title('Most Used Words')
plt.show()

四、总结

        本文总结出关于文本预处理的大多数处理方法。对于文本处理的实际过程,可以抽取某些过程进行整合处理。对于更加特殊的处理也可以特别处理。

        下一篇文章介绍文本表示技术:

使用 Python 进行自然语言处理第 4 部分:文本表示

相关文章:

  • C++ 菱形继承和虚拟菱形继承
  • C++引用详解
  • 在WebSocket中使用Redis出现空指针异常解决方案
  • Linux——如何使用sftp命令轻松上传和下载文件
  • HTTPS实现原理
  • 软件工程知识梳理2-需求分析
  • 离线使用Element UI和Vue
  • Spring Cloud Gateway
  • linux☞ Centos 基础篇
  • 【C++】构造函数和析构函数详解
  • python查询xml类别
  • 在JAVA中如何使用ASCLL码
  • go语言文件操作
  • 回归预测 | Matlab实现CPO-LSSVM冠豪猪算法优化最小二乘支持向量机多变量回归预测
  • JVM 执行引擎
  • angular2 简述
  • Angular4 模板式表单用法以及验证
  • Bytom交易说明(账户管理模式)
  • httpie使用详解
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • Map集合、散列表、红黑树介绍
  • vue自定义指令实现v-tap插件
  • 爱情 北京女病人
  • 近期前端发展计划
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 前端临床手札——文件上传
  • 思考 CSS 架构
  • 新书推荐|Windows黑客编程技术详解
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (搬运以学习)flask 上下文的实现
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (离散数学)逻辑连接词
  • (七)Java对象在Hibernate持久化层的状态
  • (生成器)yield与(迭代器)generator
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转)原始图像数据和PDF中的图像数据
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • ../depcomp: line 571: exec: g++: not found
  • .NET Core 版本不支持的问题
  • .Net Core和.Net Standard直观理解
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • .Net环境下的缓存技术介绍