文本分类——预处理

你离开我真会死。 提交于 2020-01-27 03:01:32

前言:

文本分类,NLP领域比较经典的使用场景;文本分类一般分为:特征工程+分类器+结果评价与反馈。
特征工程分为:文本预处理+特征提取+文本表示。

本文主要是文本预处理,分词——文本标准化——便于对文本的后序操作,再进行词频统计。

一、代码:

import nltk
from nltk.corpus import stopwords  #从nltk语料库中调用停用词语库
from nltk.tokenize import sent_tokenize#从nltk.tokenize中调用sen_tokenize函数实例来将短文分成句子
def read_file(filename):
    """
    #读取文档内容
    #:param filename:文档名称
    #:return: 文本数据字符串
    """
    with open(filename,'r',encoding='UTF-8') as obj_file:#不加encoding='UTF-8'有时会出现UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 11: illeg
        contents = obj_file.read()#从文本中读取数据存到变量contents中,字符串
    return contents

def del_stop_words(pre_words):
    """
    #文本标准化——删除停用词——去停用词
    #:param filename: 待处理单词所存储的列表
    #:return: 已删除停用词后的列表
    """
    stop_words = set(stopwords.words('english'))#set()返回的是集合————元素具有互异性到变量stop_words
    words = pre_words
    wordsed = [word for word in words if word not in stop_words]#停用词去掉后的单词存到列表中,再赋值给变量wordsed
    return wordsed

def word_fenci_to_words(pre_words):
    """
    #文本标准化——将文本内容分成单词——分词
    #:param filename:待处理字符串
    #:return: 返回存放单词的列表
    """
    text = pre_words
    words = nltk.word_tokenize(text)
    return words

def del_symbol(words_str):
    """
    文本标准化————将存放文本数据的字符串中特殊字符去掉
    :param words_str: 字符串
    :return: 字符串
    """
    words_str_ed = ""
    for str in words_str:
        if str in "!@#$%^&*()\n?><.,?';:[]{}\|_-+=":
            continue
        else:
            words_str_ed += str
    return words_str_ed

def word_frequency(wordsed_list):
    """
    统计词频——数据结构:字典
    :param wordsed_list:
    :return:
    """
    word_fre = {}
    for word in wordsed_list:
        if word in word_fre.keys():
            word_fre[word] +=1
        else:
            word_fre[word] = 1
    return dict(word_fre)

def get_top_10_print(word_list):
    """
    输出前十位单词
    :param word_list: 字典——存储单词和频率
    :return: 无
    """
    words_list_ed = list(word_dict.items())
    words_list_ed.sort(key=lambda x: x[1], reverse=True)
    for i in range(10):
        word, counts = words_list_ed[i]
        print('{0:<10}{1:>5}'.format(word, counts))

def IN_file(word_list_ed):
    filename = 'try'
    with open(filename,'w') as obj_file:
        words_list_ed = list(word_dict.items())
        words_list_ed.sort(key=lambda x: x[1], reverse=True)
        for i in range(10):
            word, counts = words_list_ed[i]
            obj_file.write('{0:<10}{1:>5}'.format(word, counts)+'\n')

if __name__ == '__main__': #该语句的作用是,当该文件被调用时只能调用运行此语句前面的代码;而不会运行后面的代码。
    filename = 'train_500000'
    str = read_file(filename)
    str_ed = del_symbol(str)
    list_word = word_fenci_to_words(str_ed)
    list_words_ed = del_stop_words(list_word)
    word_dict = word_frequency(list_words_ed)

    get_top_10_print(word_dict)
    IN_file(word_dict)

二、代码中函数:

1、字典函数:

可以在Python交互模式中,输入dir(dict)查看dict类包含哪些方法

dir(dict)
['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']

1、dict(),python内置函数,用于创建一个字典:

class dict(**kwarg)
class dict(mapping,**kwarg)
class dict(iterable,**kwarg)

**kwargs – 关键字
mapping – 元素的容器。
iterable – 可迭代对象。

dict = {1:'a',2:'b',3:'c'}

dict.items()
dict_items([(1, 'a'), (2, 'b'), (3, 'c')])
print(dict.items())
dict_items([(1, 'a'), (2, 'b'), (3, 'c')])

dict.keys()
dict_keys([1, 2, 3])

dict.values()
dict_values(['a', 'b', 'c'])

2、.item(self)函数:
用于获取字典中所有键值对,返回dict_items对象;

3、.keys(self)函数
用于返回字典中的所有key,返回dict_keys对象。
4、.values(self)函数:
用于返回字典中的所有value,返回dict_values对象。

2、列表函数:

1、list();
将元组转为列表——参数:元组名

>>list(dict.values())
['a', 'b', 'c']
3、排序函数:

1、.sort(key=lambda x: x[1], reverse=True)
reverse=True 逆序,即从小到大排序
reverse=True 正序,即从大到小排序
x:x[1] x没特殊要求,1的意思是,列表中每一个元素都是多维元组,根据第二位进行排序。

list1 = [(1,'a'),(2,'c'),(3,'d')]

list1.sort(key=lambda x : x[1], reverse=True)
print(list1)
[(3, 'd'), (2, 'c'), (1, 'a')]

list1.sort(key=lambda x:x[0],reverse=False)
print(list1)
[(1, 'a'), (2, 'c'), (3, 'd')]

参考:

Python——字典dict()详解

NLP之文本分类

if name == ‘main’ 的正确理解

Python 内置函数sorted()在高级用法

拓展:

关于机器学习的训练数据、验证数据和测试数据的形象比喻
Python自然语言处理工具小结
用jieba进行中文分词并统计中文词频

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!