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