1 问题背景:
对新闻文本进行分类,假设有9个类别:财经、房产、教育、科技、军事、汽车、体育、游戏、娱乐。
2 基础知识
2.1 字符串操作
- strip() :用于去除字符串两侧的空白字符(包括空格、换行、制表符等,默认是空格)。
- split(): 用于将字符串按照分隔符分割成多个子串,默认的分隔符是空格。
2.2numpy库
numpy是SciPy、Pandas等数据处理或科学计算库的基础。
例如:计算a^2+b^2,其中,b和b是一维数组
import numpy as np
a=np.array([0,1,2,3,4])
b=np.array([9,8,7,6,5])
c=a**2+b**2
print(c)
结果:
2.3 pandas库
pandas是Python第三方库,提供高性能易用数据类型和分析工具。
常见操作:
- 读取文件
- [ ] :选择数据,可以直接传入column;也可以传入column list;传入列表,并以列表顺序读取,返回DataFrame对象。DataFrame是一个表格型的数据类型,每列值类型可以不同,DataFrame既有行索引、也有列索引。 例如:
df['C']:返回C列
df[['C','D']]:返回C、D列
- pandas.concat():数据合并
pd.concat(objs, axis=0, join='outer', ignore_index=False)
objs:要连接的DataFrame或Series对象序列,可以是一个列表或字典。
axis:连接的轴,默认为0,表示按行连接。
join:连接方式,默认为’outer’,表示使用并集的方式进行连接。
ignore_index:是否忽略连接后结果中的索引,默认为False。
例如:
import pandas as pd
df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
df2 = pd.DataFrame({'A': [5, 6], 'B': [7, 8]})
# 使 用concat函数进行行连接
df_concat_rows = pd.concat([df1, df2])
print(df_concat_rows)
结果:
# 使用concat函数进行列连接
df_concat_cols = pd.concat([df1, df2], axis=1)
print(df_concat_cols)
结果:
- get_dummies():进行One-hot编码,将分类变量转换为虚拟变量。
import pandas as pd
data = {'颜色': ['红色', '绿色', '蓝色', '红色']}
df = pd.DataFrame(data)
encoded_df = pd.get_dummies(df['颜色'])
print(encoded_df)
- drop()函数:删除数据集中多余的数据
DataFrame.drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors='raise')
常用参数:
label s:待删除的行名or列名;
axis:删除时所参考的轴,0为行,1为列;
index:待删除的行名
columns:待删除的列名
level:多级列表时使用,暂时不作说明
inplace:布尔值,默认为False,这是返回的是一个copy;若为True, 返回的是删除数据后
的结果。
例如:
#构造一个数据集
import pandas as pd
import numpy as np
df1=pd.DataFrame(np.arange(25).reshape(5,5),columns=list('ABCDE'))
- 删除行数据
#下面两种删除方式是等价的,传入labels和axis 与只传入一个index 作用相同,删除第0行
df2=df1.drop(labels=0,axis=0)
df22=df1.drop(index=0)
- 删除多行数据
df3=df1.drop(labels=[0,1,2],axis=0)
df33=df1.drop(index=[0,1,2])
- 删除列数据
df4=df1.drop(labels=['A','B','C'],axis=1)
df44=df1.drop(columns=['A','B','C'])
- inplace参数的使用'
dfs=df1
#inplace=None时返回删除前的数据
dfs.drop(labels=['A','B','C'],axis=1)
#inplace=True时返回删除后的数据
dfs.drop(labels=['A','B','C'],axis=1,inplace=True)
- .Shape
Pandas Shape是Pandas库中的一个重要属性,它用来表示一个数据集(DataFrame或 Series)的形状,也就是行数和列数。它可以用来进行数据的统计分析和筛选。 shape属性的 返回值是一个元组,其中第一个元素表示行数,第二个元素表示列数,例如(5, 5)。在二维 矩阵中,df.shape[0]返回的是df的行数,df.shape[1]返回的是df的列数。如果出现shape[-1]表 示的即为最后一维。
例如:
import pandas as pd
import numpy as np
df1=pd.DataFrame(np.arange(25).reshape(5,5),columns=list('ABCDE'))
print(df1.shape) # 查看数据集的行数和列数
结果:
print(df.size) # 查看数据集的元素个数
结果:
2.4 re库
Python 的 re 模块提供了re.sub用于替换字符串中的匹配项。
- re.sub():函数共有5个参数:
pattern:表示正则中的模式字符串;
repl:表示要替换的字符串(即匹配到pattern后替换为repl),也可以是个函数;
string:表示要被处理(查找替换)的原始字符串;
count:可选参数,表示要替换的最大次数,而且必须是非负整数,该参数默认为0,即所有 的匹配都会替换;
flags:可选参数,表示编译时用的匹配模式(如忽略大小写、多行模式等),数字形式,默 认为0。
例如:
import re
s="12abc34"
s1=re.sub(r'[0-9]', '*', s) #这句话表示只匹配单一数字,并将每一个数字替换为一个星号 。
print(s1)
结果:
3 数据预处理
3.1分词
- 目的:方便将中文文本转化为词向量存储、处理。
- 编程思路:
1)读取数据
import numpy as np #引用库numpy
import re #引用库re
import pandas as pd #引用库pandas
trainset_path = './data/trainset.xlsx'
df_caijing = pd.read_excel(trainset_path,sheet_name='财经')
df_fangchan = pd.read_excel(trainset_path,sheet_name='房产')
....
2)编写函数punct_handling()处理标点、数字、特殊符号。
def punct_handling(inputstr):
remove_str = \"[\\s+\\.:\\!-\\/_,$%\\[\\]^\\)*(+\\\"\\']+|[+——! 1234567890·, 。??、
~@#¥ %……&*()` | \\\" ~〜 【】 ※]“1234567890”+“
punc = \"!?。"#$%&'()*+,-/:;<=>@[\]^_`{|}~⦅⦆ 「」、、 〃》「」『』【】〔〕〖〗〘〙〚〛〜〝〞"
punc = punc.encode('utf-8').decode(\"utf-8\")
string1 = re.sub(remove_str,””,inputstr)
string1 = re.sub(punc,””,string1)
return string1
3)编写函数seg_depart()对excel文档每一行,调用函数punct_handling()处理标点、数 字、特殊符号后,利用jieba库进行中文分词,利用for循环去掉停用词。
# 对句子进行中文分词
def seg_depart(sentence):
sentence = punct_handling(sentence)
sentence_depart = jieba.cut(sentence.strip())
outstr = ''",
# 去停用词,词之间空格分开
for word in sentence_depart:
if word not in stopwords:
if word != '\\t':
outstr += word
outstr +=” ”
return outstr
4)调用函数实现分词
3.2关键词提取
- 采用TF-IDF算法
tfidf(x)=tf(x)*tf_corpus(x,types)*idf(x),idf(x)=log(total_num/(num(x)+1))
x表示词语,tfidf(x)为该词的关键指数, tf(x)表示该词在当前新闻中的词频。tf_corpus(x)
代表该词在类别为types的语料库中出现的次数,idf(x)为逆文档率。total_num表示所
有语料库中总的新闻数,num(x)表示包含该词x的新闻数。
- 编程思路
- 加载预处理后的语料库
- 遍历语料库,获取每一条新闻、每一个语料库的词典的列表以及获取全语料库的词数。
定义的函数有:
def count_words_in_sentence(string): #计算词频
def get_corpus_dict(sentences_num): #计算每一个语料库词典的列表
def get_total_words_num(corpus_dict_list): #计算全语料库中词数
3. 遍历每一条新闻,计算每个词的关键指数。
主要函数有:
def tf1(word,string): #计算某词出现在当前新闻的次数 / 全新闻词数
def tf2(word,type_id,corpus_dict_list,words_num):
#计算某词出现在该语料库中的次数 / 全语料库词数
def idf(word, dict_list): #计算 log(新闻总数 / 包含该词的新闻数+1)
def tfidf(word, string, dict_list,type_id,corpus_dict_list,words_num):
#计算词的关键指数
4. 保存关键指数最高的maxlen个词,存储为新的新闻。
def get_keyword_sentence(index): # 保存关键指数最高的词
下一步。
3.3 搭建和训练模型