NLP任务中的文本预处理步骤、工具和示例
数据是新的石油 , 文本是我们需要更深入钻探的油井 。 文本数据无处不在 , 在实际使用之前 , 我们必须对其进行预处理 , 以使其适合我们的需求 。 对于数据也是如此 , 我们必须清理和预处理数据以符合我们的目的 。 这篇文章将包括一些简单的方法来清洗和预处理文本数据以进行文本分析任务 。
【NLP任务中的文本预处理步骤、工具和示例】我们将在Covid-19 Twitter数据集上对该方法进行建模 。这种方法有3个主要组成部分:
首先 , 我们要清理和过滤所有非英语的推文/文本 , 因为我们希望数据保持一致 。
其次 , 我们为复杂的文本数据创建一个简化的版本 。
最后 , 我们将文本向量化并保存其嵌入以供将来分析 。
文章插图
第1部分:清理和过滤文本首先 , 为了简化文本 , 我们要将文本标准化为仅为英文字符 。 此函数将删除所有非英语字符 。
def clean_non_english(txt):txt = re.sub(r'\W+', ' ', txt)txt = txt.lower()txt = txt.replace("[^a-zA-Z]", " ")word_tokens = word_tokenize(txt)filtered_word = [w for w in word_tokens if all(ord(c) < 128 for c in w)]filtered_word = [w + " " for w in filtered_word]return "".join(filtered_word)
我们甚至可以通过删除停止词来做得更好 。 停词是出现在英语句子中对意思没有多大帮助的常见词 。 我们将使用nltk包来过滤stopwords 。 由于我们的主要任务是使用word cloud将tweet的主题可视化 , 所以这一步需要避免使用"the , ""a , "等常见单词 。 但是 , 如果你的任务需要完整的句子结构 , 比如下一个单词预测或语法检查 , 你可以跳过这一步 。
import nltknltk.download('punkt') # one time executionnltk.download('stopwords')from nltk.corpus import stopwordsstop_words = set(stopwords.words('english'))def clean_text(english_txt):try:word_tokens = word_tokenize(english_txt)filtered_word = [w for w in word_tokens if not w in stop_words]filtered_word = [w + " " for w in filtered_word]return "".join(filtered_word)except:return np.nan
对于tweets , 在清理之前我们需要考虑一个特殊的特性:提及@ 。 您的数据可能具有这样的特殊特性(也可能没有) , 这是具体情况 , 而不是普遍要求 。 因此 , 在盲目地清理和预处理数据之前 , 要充分了解您的数据!
def get_mention(txt):mention = []for i in txt.split(" "):if len(i) > 0 and i[0] == "@":mention.append(i)return "".join([mention[i] + ", " if i != len(mention) - 1 else mention[i] for i in range(len(mention))]
以前 , 我们清理非英文字符 。 现在 , 我们删除非英语文本(语义上) 。 Langdetect是一个python包 , 它允许检查文本的语言 。 它是谷歌的语言检测库从Java到Python的直接端移植 。
from langdetect import detectdef detect_lang(txt):try:return detect(txt)except:return np.nan
然后我们过滤掉所有不是"en"语言的列 。
第2部分:简化复杂的数据对于数值数据 , 良好的处理方法是缩放 , 标准化和规范化 。 此资源有助于理解并将这些方法应用于您的数据 。 在本文的讨论范围内 , 由于其他资源在此方面做得很好 , 因此我将不做进一步讨论 。
对于分类数据 , 有许多方法 。 两种名义上的方法是标签编码器(为每个标签分配一个不同的编号)和一种热编码(以0和1的向量表示) 。 有关这些分类值的方法的更多详细信息 , 请参见此处 。 与我提到的这两种资源相比 , 此资源非常丰富 , 具有更多类型的编码 。
这篇文章将介绍一些减少数据特别是位置数据复杂性的方法 。 在我的数据集中 , 有一列位置 , 带有作者的地址 。 但是 , 由于这些原始数据过于混乱和复杂(具有城市 , 县 , 州 , 国家/地区) , 因此我无法对其进行太多分析 。 因此 , 我们可以将文本标准化 , 并将其缩小到"国家"级别 。 处理位置数据的程序包是geopy 。 它可以识别正确的地址并将这些位置重新格式化为标准格式 。 然后 , 您可以选择保留所需的任何信息 。 对我来说 , 国家 , 国家足够体面 。
from geopy.geocoders import Nominatimgeolocator = Nominatim(user_agent="twitter")def get_nation(txt):try:location = geolocator.geocode(txt)x = location.address.split(",")[-1]return xexcept:return np.nan
第3部分:向量化和嵌入文本向量化将文本转换为值的向量以表示其含义 。早些时候 , 我们有一种热编码方法 , 其向量的大小与我们的词汇量相同 , 在出现文本的任何地方都为1 , 在其他地方为0 。如今 , 我们拥有更高级的方法 , 例如spacy , GloVe甚至bert嵌入 。对于本项目的范围 , 我将向您介绍python和Jupiter笔记本中的GloVe 。
- 脸上|那个被1亿锦鲤砸中的“信小呆”:失去工作后,脸上已无纯真笑容
- 夹缝|“互联网卖菜”背后:夹缝中的菜贩与巨头们的垄断
- 自动任务|赶在三星 S21 发布之前实现语音解锁
- 骁龙865|5G手机中的性能怪兽,256+120W闪充,比iPhone12值得买
- 还原任务栏|任务栏怎么还原
- go-zero 如何应对海量定时/延迟任务?
- RFID在冷链物流中的作用-RFID冷链资产管理解决方案
- 成员|千元机中的实力派再添新成员,三部千元机,一部更比一部强!
- Kotlin集合vs Kotlin序列与Java流
- 金融市场中的NLP——情感分析