前言:
文本分类,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自然语言处理工具小结
用jieba进行中文分词并统计中文词频
来源:CSDN
作者:初学者wwl
链接:https://blog.csdn.net/qq_43708315/article/details/104038924