项目:微博情感分析(NLTK)

本文介绍了如何使用NLTK库进行情感分析,包括NLTK的介绍、安装、分词、词性标注、典型文本处理流程、情感分析、文本相似度计算、文本分类以及案例分析。重点讲解了NLTK在中文分词、去除停用词和情感分析中的应用。
摘要由CSDN通过智能技术生成

1.NLTK介绍

应用:情感分析,文本相似度,文本分析。
自带分类、分词功能。
语料库,实际使用真实语言。

2.安装

import nltk
nltk.download()
语料库 nltk.corpus
模块www.nltk.org/py-modindex.html#

3.分词

将句子差分成具有语言语义学上意义的词。
中英文分词区别。
中文分词工具,如结巴分词。
得到分词结果后,中英文的后续处理没有太大区别。
词干提取stemming。
词性归并lemmatization,将单词的各种词性归并到一种,pos制定词性。
词性归一化。

4.词性

nltk.word_tokenize词性标注。
为节省储存空间和提高效率NLP会自动过滤某些词。停用词都是人工输入,非自动化生成的,形成停用词表(语气词、无意义词)。
中文停用词表:中文停用词表、合工大停用词表、四川大学停用词表。
使用NLTK去除停用词stopworks.works()。

5.典型文本处理流程

原始文本—分词—词性归一化—去除停用词—处理好的单词列表

6.情感分析

将自然语言(文本)转化为计算机程序更容易理解的形式。
预处理得到的字符串–向量化(特征提取)。

6.1简单的情感分析

情感字典:人工构造一个字典、关键词匹配。
简单粗暴但好用,但是遇到新词特殊词时扩展性较差。
使用机器学习nltk.classify。

7.文本相似度

度量文本之间的相似性;
使用词频表示文本特征;
将文本表示成向量;
余弦相似度

8.文本分类

TF-IDF(词频-逆文档频率)
TF,Term Frequency(词频),某个词在该文件中出现的次数。
IDF,逆文档频率,用于衡量某个词普遍的重要性。
TF-IDF = TF* IDF.
TF=当前词在文档中出现的次数/文档中词的总数
IDF=log(总文档个数/当前词出现的文档个数)
nlkt实现:TextCollection.tf_idf()

9.案例

数据:0喜悦1愤怒2厌恶3低落
步骤:文本读取、分割测试集训练集、特征提取、模型训练预测

10.代码及注释

main,py

# -*- coding: utf-8 -*-


import os
import pandas as pd
import nltk
from tools import proc_text, split_train_test, get_word_list_from_data, \
    extract_feat_from_data, cal_acc
from nltk.text import TextCollection
from sklearn.naive_bayes import GaussianNB

dataset_path = './dataset'
text_filenames = ['0_simplifyweibo.txt', '1_simplifyweibo.txt',
                  '2_simplifyweibo.txt', '3_simplifyweibo.txt']

# 原始数据的csv文件
output_text_filename = 'raw_weibo_text.csv'

# 清洗好的文本数据文件
output_cln_text_filename = 'clean_weibo_text.csv'

# 处理和清洗文本数据的时间较长,通过设置is_first_run进行配置
# 如果是第一次运行需要对原始文本数据进行处理和清洗,需要设为True
# 如果之前已经处理了文本数据,并已经保存了清洗好的文本数据,设为False即可
is_first_run = True


def read_and_save_to_csv():
    """
        读取原始文本数据,将标签和文本数据保存成csv
    """

    text_w_label_df_lst = []
    for text_filename in text_filenames:
        text_file = os.path.join(dataset_path, text_filename)

        # 获取标签,即0, 1, 2, 3
        label = int(text_filename[0])

        # 读取文本文件
        with open(text_file, 'r', encoding='utf-8') as f:
            lines = f.read().splitlines()

        labels = [label] * len(lines)

        text_series = pd.Series(lines)
        label_series = pd.Series(labels)

        # 构造dataframe
        text_w_label_df = pd.concat([label_series, text_series], axis=1)
        text_w_label_df_lst.append(text_w_label_df)

    result_df = pd.concat(text_w_label_df_lst
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值