NLP 数据清洗和词标记化

数据挖掘 Python nlp 数据清理
2022-03-07 18:43:18

我是 NLP 的新手,并且有一个数据集,其中包含一堆(社交媒体)消息,我想在这些消息上尝试一些方法,例如潜在 Dirichlet 分配 (LDA)。首先,我需要清理标点符号、表情符号等的数据。我不确定如何以最有效和最准确的方式执行此操作。我现在的代码是这样的:

import pandas as pd
import re

class TopicModel():
    def __init__(self, data_path = "data.csv"):
        self.data_path = data_path
        self.data = pd.read_csv(self.data_path, low_memory=False)

    def clean_data(self):
        self.remove_message_na()
        self.remove_emojis()
        self.remove_punctuation_and_lower()
        self.remove_url()
        self.remove_empty_messages()

    def remove_message_na(self):
        self.data = self.data.loc[~pd.isna(self.data['message'])]

    def remove_emojis(self):
        self.data['message'] = self.data['message'].str.encode("ascii", "ignore").str.decode("utf8")

    def remove_punctuation_and_lower(self):
        p = re.compile('''[!#?,.:";]''')
        self.data['cleaned_data'] = [p.sub("", ii).lower() for ii in self.data['message'].tolist()]

    def remove_empty_messages(self):
        self.data = self.data.loc[self.data['cleaned_data'] != ""]

    def remove_url(self):
        self.data = [re.sub(r"http\S+", "", ii) for ii in self.data['message'].tolist()]

我不想删除缩略语,这就是我'从标点符号列表中省略的原因,但我认为最理想的情况是,将缩略词重新格式化为两个单独的单词。在处理社交媒体数据时,我还想知道其他标点符号,例如#. 我知道这个问题有点笼统,但我想知道在执行主题分析、情绪分析等之前是否有一个好的 python 库来执行我想要的那种数据清理操作。我也想了解哪些库可以有效地对 pandas 数据框执行这些数据清理操作。

1个回答

我总结了您的问题,然后尝试在每个要点下回答:

  • 如何删除标点符号(例如 # 用于社交媒体中的主题标签)

第一个 goto 是一个经常用于数据预处理的正则表达式。但是,如果您要从文本中删除所有标点符号,则可以使用以下两种方法之一:

import string
sentence = "hi; how*, @are^ you? wow!!!"
sentence = sentence.translate(sentence.maketrans('', '', string.punctuation))
print(sentence)

输出:'hi how are you wow'

或使用正则表达式,例如:

import re
s = "string. With. Punctuation? 3.2"
s = re.sub(r'[^\w\s]','',s)
print(s)

输出:'string With Punctuation 32'

  • 有哪些可能用于数据清理的 python 库?

一般来说,NLTK 和 SciPy 非常好用。但出于特定目的,也存在其他库。例如库contractionsinflect.

  • 使用 pandas 数据框时,哪些库在数据清理方面效率很高?

您可以使用该方法将任何库中的任何函数应用于您的 pandas 数据框apply这是一个例子:

mport pandas as pd 
s = pd.read_csv("stock.csv", squeeze = True) 
  
# adding 5 to each value 
new = s.apply(lambda num : num + 5) 

代码源