一、工具
语言:python3.5
语料:人民日报语料
二、任务分词
1. 抽取词表,统计词频
给的素材如图 1 所示:
观察上边的格式,可以得到:所抽取的文本信息(包括标点)都是在两个空格和 / 之间,所以正则表达式如下:
# text 是文本信息
import re
pattern = re.compile(r' (.*?)/')
fenci = re.findall(pattern,text)
但在 fenci 中会出现 “[北京”这样的情况,这是在处理有些词汇的时候,使用嵌套结构,保留了两种结果。
以“北京石景山发电总厂”为例,语料为 “[北京/ns 石景山/ns 发电/vn 总厂/n]nt”,即:北京、石景山、发电、总厂各自是一个词,总体也是一个词。
鉴于此,我将所抽取的词汇分为两种:
- 可以直接通过上述正则直接抽取的,即颗粒度小的
- 一个整体的名词
针对上述两种情况,对于第一种词汇,首先将文本中的 [] 去掉,然后通过上边的正则表达式抽取;对于第二种词汇,通过 [.*?] 抽取,然后将词汇合为一个整体词汇。
这两个词表合起来就达到了抽取词表的效果。
import re
pattern1 = re.compile(r' (.*?)/')
pattern3 = re.compile(r'\[(.*?)]')
pattern4 = re.compile(r'[a-z\[\]\s\/]*')
# 除去文本中 [] 符号,方便抽取颗粒比较细的中文词汇
text1 = re.sub(r'[\[\]]*','',text)
# fenci_list 小颗粒词汇
# buchongci 大颗粒词汇
fenci_list = re.findall(pattern1,text1)
buchongci = re.findall(pattern3,text)
# 提取 [] 中的文本
buResult = []
for i in buchongci:
temp = re.sub(pattern4,'',i)
buResult.append(temp)
# 合并两个 list
Fenci_list = buResult + fenci_list
接着开始统计词频,由于 Fenci_list 比较大,所以使用 Counter 比较方便。代码如下:
from collections import Counter
data = dict(Counter(Fenci_list))
data2 = sorted(data.items(),key = lambda e:e[1],
reverse = False)