笔记来自课程:玩转文本挖掘(51ct0学院),总结整理为个人学习、复习使用,供参考。
英文文本天生带有空格,而中文文本没有间隔,且中文同一个词在不同语境下的含义不同,中文的智能分词及分析相对难度要高。
语料库在文本分词中发挥重要作用,不同的语料库有着不同设计目的,如古腾堡语料库(图书),布朗语料库(综合),路透社语料库(新闻)…
(但布朗语料库支持英文,中文不适用)
可以自己加工语料库,常见的语料库格式:
使用词袋模型进行后续数据分析时常见格式,行/列代表语料index,相应的列/行代表词条,或者需要加以记录的文档属性,如作者,原始超链接,发表日期等
词条/文档对应时,单元格记录相应的词条出现频率,或者相应的概率/分值
Doc2Term矩阵
Term2Doc矩阵
可以和原始语料的外部文件/list配合使用
对于单个文档,也可以建立DataFrame,用行/列代表一个句子/段落/章节。
以上面最后一种形式DataFrame建立语料库,单个文档的DataFrame
import pandas as pd
import os
#os.chdir(r'')
#导入一个文档
raw=pd.read_table('金庸-射雕英雄传txt精校版.txt',names=['txt'],encoding='GBK')
print(len(raw))
raw[10:100] #一段作为一个记录读进去
文档读入的前后包括序、附录等,对真正的分析没有什么用处,可以加入章节标识,去掉
如何加入章节标识,这里要根据文章txt的内容确定,这里导入的文本,章节的划分是“第一回 风雪惊变”,也就是段落的第一个字是“第”,后面有“回 ”,且长度不长,根据这些条件基本可以定位到章节划分的地方,那么下面就设置这些条件,判断记录是不是章节划分处。
'''定位段落第一个字'''
def m_head(tmpstr):
return tmpstr[:1]
'''定位段落是否包含章节名称关键字“回 ”'''
def m_mid(tmpstr):
return tmpstr.find('回 ')
'''接着将函数应用到每一个段落,找到这些定位处的内容'''
raw['head']=raw.txt.apply(m_head)
raw['mid']=raw.txt.apply(m_mid)
raw['len']=raw.txt.apply(len)
#查看
raw.loc[raw['len']==8]
'''再加判断条件,添加章节编号'''
chapnum=0
for i in range(len(raw)):
if raw['head'][i]=='第' and raw['mid'][i] >0 and raw['len'][i] < 30: #添加章节编号
chapnum += 1
if chapnum >= 40 and raw['txt'][i]=='附录一:成吉思汗家族': #去掉附录
chapnum=0
raw.loc[i,'chap']=chapnum #添加编号一列
#添加编号后,可以删除临时变量
del raw['head']
del raw['mid']
del raw['len']
raw.head(50)
#查看一下段落一般有多少字符
import matplotlib.pyplot as plt
%matplotlib inline
raw.txt.agg(len).plot.box()
'''去掉前后无用的,提取第一章'''
#根据章节分组
rawgrp=raw.groupby('chap') #分组后类似一个个元组..
print(type(rawgrp))
'''
#打印看一看
for item in rawgrp:
print(item)
'''
#合并字符串
'''在字符串列的情况下,sum函数自动合并字符'''
chapter=rawgrp.agg(sum)
#去掉章节为0的
chapter=chapter[chapter.index!=0]
#查看第一章
chapter.txt[1] #有空格
更简洁的形式:
#一句命令也可以实现
#raw.groupby('chap').sum().iloc[1].txt
raw.groupby('chap').agg(sum).iloc[1].txt
#一个笨拙去掉空格,选出第一章的尝试
#t=[]
t=''
for i in range(0,len(raw[raw['chap']==1])):
#t.append(raw[raw['chap']==1].iloc[i].txt.strip()) #列表形式
t=t+raw[raw['chap']==1].iloc[i].txt.strip() #字符串拼接
print(t)