人物文本情感分析

文本数据预处理

情感分析模型主要涉及两个数据集,一个是我们在推特上收集的参议员发布的推文信息数据用于测试数据集A,另一个为用于情感分析的原始数据集,即只包含文本的数据集B.数据集A用于得到想要的情感分析结果,数据集B用于训练和测试。

本模型训练数据集B为斯坦福大学的Sentiment140数据集,包含了1.6亿条标注情感极性的推文,数据集A为我们从twitter上爬取的众多参议员推文。

预处理主要是处理数据集B中的原始数据和数据集A中的文本,目的是将包含网页链接、标点符号及无意义单词的杂乱数据转化为干净的由有意义单词组成的字符串,并使用pandas dataframe存储。

正则表达式可通过删除网址、表情符号、网页标签和标点符号来清理文本。

stop_words = set(stopwords.words('english'))
def clean_text(sentence):
    # 删除URL
    sentence = re.sub(r"https?://\S+|www\.\S+"," ",sentence)
    
    # 删除 HTML 标记
    sentence = re.sub(r"<.*?>|&([a-z0-9]+|#[0-9]{1,6}|#x[0-9a-f]{1,6});"," ",sentence)
    
    # 删除标点符号
    sentence = re.sub(r"[^\w\s]", " ", sentence)
        
    # 删除带有数字的单词 
    sentence = re.sub(r"\w*\d\w*", " ", sentence)
        
    # 删除数字 
    sentence = re.sub(r"[0-9]+", " ", sentence)
        
    # 清除空格
    sentence = re.sub(r"\s+", " ", sentence).strip()
        
    sentence = sentence.lower()
    # 检查停用词
    tokens = []
    for token in sentence.split():
        if token not in stop_words:
            tokens.append(token)
    return " ".join(tokens) 

该函数首先导入了导入了英文的停用词集,因为我们在爬取数据时数据基本都是英文。停用词是在文本分析中通常被忽略的常见词(如“the”, “is”, “in”),因为它们对于理解文本的主要内容通常没有太大帮助。

移除URL

使用正则表达式替换文本中的URL(以'http://'或'https://'开头,或以'www.'开头的部分)为一个空格。

移除HTML标签

使用正则表达式删除HTML标签和HTML实体。

移除标点符号

删除除了单词字符(字母、数字、下划线)和空白字符之外的所有字符,包括标点符号。

移除含有数字的词汇

删除所有包含数字的词汇,比如“year2020”或“4you”。

移除数字

删除所有独立的数字。

清除多余空白

将一个或多个空白字符替换为单个空格,并删除字符串两端的空白

转化为小写

将所有文本转换为小写,这有助于在后续处理中保持一致性,因为英文中的大小写通常不影响词汇的含义。

过滤停用词

将句子分割成单词(tokens),检查每个单词是否在停用词集中。如果不在,就将其添加到结果列表中。最后,使用空格将这些单词连接起来形成一个处理后的字符串。

这个函数整体上是一个典型的文本清洗流程,主要用于数据预处理,通过移除无关内容和规范化文本,可以提高后续分析或模型训练的质量和效率。

Tokenizer -> 为文本中的每个单词分配一个唯一的整数索引。

tokenizer = Tokenizer()
tokenizer.fit_on_texts(X_train)

# 将文本转换为整数序列
X_train = tokenizer.texts_to_sequences(X_train)
X_test = tokenizer.texts_to_sequences(X_test)

该代码创建了一个 Tokenizer 对象。Tokenizer 是 Keras 提供的一个用于文本预处理的类,它可以将文本转换为一系列的整数(每个整数代表字典中的一个词汇)。接着,使用训练数据 X_train来训练(适配)这个 Tokenizer。这个过程包括构建词汇索引(每个唯一单词都分配一个唯一的整数)。fit_on_texts 方法基于训练集中的词汇建立内部词汇表,以便将文本转换为数值序列。

texts_to_sequences 方法将训练集 X_train 和测试集 X_test 中的文本转换为一系列整数序列。这里,文本中的每个单词都被转换成对应的整数索引。这些整数索引是在之前调用 fit_on_texts 方法时建立的。转换后的序列可以被用作我们所建立的情感分析模型的输入。

建立模型

max_len = 30  # 最长序列长度
X_train = pad_sequences(X_train, maxlen=max_len)
X_test = pad_sequences(X_test, maxlen=max_len)
print(f"After padding: {X_train.shape}")
print(f"After padding:{X_test.shape}")
vocabulary_size = len(tokenizer.word_index) + 1
vocabulary_size
embedding_dim=100
input_dim=1
input_shape = (max_len, input_dim)
CNN=models.Sequential([
    layers.Embedding(vocabulary_size, embedding_dim, input_length=max_len, trainable=True),
    
    layers.Conv1D(filters=128,kernel_size=7,activation='relu'),
    layers.Conv1D(filters=128,kernel_size=7,activation='relu'),
    layers.GlobalMaxPooling1D(),
    
    layers.Flatten(),
    layers.Dense(1024,activation="relu"),
    layers.Dropout(0.5),
    
    layers.Dense(1, activation='sigmoid')
])

在建立模型之前,我们定义了序列的最大长度为 30。也就是说,输入到模型的所有文本序列将被填充或截断到这个长度。

使用 pad_sequences 函数处理 X_trainX_test 数据,确保所有序列都有统一的长度(在这里是 30)。如果序列长度小于 30,将会在序列前面添加 0 以达到指定长度;如果序列长度超过 30,将会截断超出部分。

我们使用Keras Sequential API 构建CNN模型。模型包括以下层:

  • Embedding 层:将整数序列(单词索引)映射到密集向量的可训练嵌入空间。

  • Conv1D 层:一维卷积层,用于提取序列数据的局部特征。

  • GlobalMaxPooling1D:对卷积层的输出进行全局最大池化。

  • Flatten 层:将数据展平,以便于输入到全连接层。

  • Dense 层:全连接层,用于学习特征组合。

  • Dropout 层:减少过拟合的风险。

  • 输出层:单个神经元,使用 sigmoid 激活函数。

此模型通过卷积层提取文本数据的局部特征,并通过全连接层进行分类。CNN模型的这种结构特别适用于处理文本数据,帮助我们分析推特推文情感,它可以有效捕捉局部依赖并减少参数数量,提高训练效率。

  • 21
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值