《自然语言处理(哈工大 关毅 64集视频)》学习笔记:第三章 汉语的分词与频度统计

版权声明:本文为博主原创文章,未经博主允许不得转载。欢迎加本人实名微信(Zhou_zhongliang),一起学习,共同进步。 https://blog.csdn.net/weixin_43935926/article/details/86053733

前言
关毅老师,现为哈工大计算机学院语言技术中心教授,博士生导师。通过认真学习了《自然语言处理(哈工大 关毅 64集视频)》1(来自互联网)的课程,受益良多,在此感谢关毅老师的辛勤工作!为进一步深入理解课程内容,对部分内容进行了延伸学习2 3 4,在此分享,期待对大家有所帮助,欢迎加我微信(验证:NLP),一起学习讨论,不足之处,欢迎指正。
在这里插入图片描述
视频列表:
17 汉语的分词与频度统计(一)
18 汉语的分词与频度统计(二)
19 汉语的分词与频度统计(三)
20 汉语的分词与频度统计(四)
21 汉语的分词与频度统计(五)
22 数学基础与语言学基础(六)
23 汉语的分词与频度统计(七)

17 汉语的分词与频度统计(一)

第三章 汉语的分词与频度统计

汉语的分词

世界语言分类

传统语言学根据词的结构将世界语言划分为三类

孤立语

  • 又称“词根语”“无形态语”
  • 词内没有专门表示语法意义的附加成分,形态变化很少,语法关系靠词序和虚词来表示,例如汉语

黏着语

  • 又称“胶着语”
  • 词内有专门表示语法意义的附加成分,一个附加成分表达一种语法意义,词根或词干跟附加成分结合不紧密,例如日语。

曲折语

  • 用词的形态变化表示语法关系,词根或词干跟词的附加成分结合的很紧密,例如英语

孤立语、粘着语都存在分词问题

什么是词

词是自然语言中最小的有意义的构成单位

汉语词的特点

  • 汉语的五级语法单位
    语素、词、短语、句子、句群
  • 结合紧密、使用频繁
  • 汉语的词可以拆开
    如:“革命也好罢,”阿Q想,“革这伙妈妈的命,太可恶!太可恨!
  • 可以调换位置
    如:理发-理了好几次发-发理了
  • 可以有限度地扩展
    如:看见-看得见,看不见

什么是分词

分词是把没有明显分界标志的字串切分为词串。

  • 根据分词规范,建立及其词典
  • 根据分词算法和机器词典,把字串切分为词串
    示例1
    十年春齐师伐我公将战曹刿请见其乡人曰肉食者谋之又何间焉刿曰肉食者鄙未能远谋
    十年春,齐师伐我。公将战,曹刿请见。其乡人曰:“肉食者谋之,又何间焉。刿曰:“肉食者鄙,未能远谋。
# -*- coding: utf-8 -*-
import os
LTP_DATA_DIR = '.\\ltp_data\\'  # ltp模型目录的路径
cws_model_path = os.path.join(LTP_DATA_DIR, 'cws.model')  # 分词模型路径,模型名称为`cws.model`

from pyltp import Segmentor
segmentor = Segmentor()  # 初始化实例
segmentor.load(cws_model_path)  # 加载模型
words = segmentor.segment('十年春齐师伐我公将战曹刿请见其乡人曰肉食者谋之又何间焉刿曰肉食者鄙未能远谋')  # 分词
print('/'.join(words))

十/年/春齐师伐/我/公/将/战曹/刿请/见/其/乡人/曰/肉食者/谋/之/又/何间/焉刿曰/肉食者/鄙/未能/远谋

示例2
在2001年的中美黑客大战中8万中国黑客一起行动使中国红旗在美国白宫网站飘扬两个小时
在/2001/年/的/中/美/黑客/大/战/中/8/万/中国/黑客/一起/行动/使/中国/红旗/在/美国/白宫/网站/飘扬/两/个/小时

words = segmentor.segment('在2001年的中美黑客大战中8万中国黑客一起行动使中国红旗在美国白宫网站飘扬两个小时')  # 分词
print('/'.join(words))

在/2001年/的/中/美/黑客/大战/中/8万/中国/黑客/一起/行动/使/中国/红旗/在/美国/白宫/网站/飘扬/两/个/小时

segmentor.release()  # 释放模型

为什么分词

  • 汉语的机器自动分词是汉语信息处理系统的重要组成部分
  • 正确的机器自动分词是正确的中文信息处理的基础

文本检索

如:

  1. 和服 | 务 | 于三日后裁制完毕,并呈送将军府中。
  2. 王府饭店的设施 | 和 | 服务 | 是一流的。
    如果不分词或者“和服务”分词有误,都会导致荒谬的检索结果。

文语转换

如:

  1. 他们是来 | 查 | 金泰 | 撞人那件事的。(“查”读音为cha)
  2. 行侠仗义的 | 查金泰 | 远近闻名。(“查”读音为zha)

机器翻译

如:

  1. 我看见邓小平同江泽民打招呼
    I see Deng Xiaoping and Jiang Zemin greeted
  2. 我看到王义和老师在讲课
    I see Wang and teachers in lectures
17 汉语的分词与频度统计(二)

分词规范

中国国家标准GB13715 刘源等《信息处理用现代汉语分词规范及自动分词方法》

分词规范内容实录

1、 二字或三字词,以及结合紧密、使用稳定的
如:
发展 可爱 红旗
对不起 自行车 青霉素
2 、四字成语一律是词
例如:
胸有成竹 欣欣向荣
3、 五字和五字以上的谚语、格言等,分开后如不违背原有组合的意义,应予切分。
例如:
时间/就/是/生命/

分词的主要难点

切分歧义

交集型切分歧义

汉字串AJB被称作交集型切分歧义,如果满足AJ、JB同时为词(A、J、B分别为汉字串)。此时汉字串J被称作交集串。
[例] 交集型切分歧义:“结合成分子”
结合 | 成 分|子 |
结 | 合成 |分子|
结合|成|分子|

words = segmentor.segment('结合成分子')  # 分词
print('/'.join(words))

结合/成分子

[例] 交集型切分歧义:“美国会通过对台售武法案”

words = segmentor.segment('美国会通过对台售武法案')  # 分词
print('/'.join(words))

美/国会/通过/对/台售武/法案

[例] 交集型切分歧义:“乒乓球拍卖完了”

words = segmentor.segment('乒乓球拍卖完了')  # 分词
print('/'.join(words))

乒乓球/拍卖/完/了

覆盖型切分歧义

汉字串AB被称作覆盖型切分歧义,如果满足条件:
(1)A、B、AB同时为词;
(2)中文文本中至少存在一个前后语境C,在C的约束下,A、B在语法和语义上都成立。
[例]覆盖型切分歧义:“美女”
美/女/运动员/涉嫌/服用/兴奋剂
美女/运动员/受/到/观众/的/喜爱

words = segmentor.segment('美女运动员涉嫌服用兴奋剂')  # 分词
print('/'.join(words))

美女/运动员/涉嫌/服用/兴奋剂

words = segmentor.segment('美女运动员受到观众的喜爱')  # 分词
print('/'.join(words))

美女/运动员/受到/观众/的/喜爱

“真歧义”和“伪歧义”

  • 同属交集型,“地面积”为真歧义(“这几块 | 地 | 面积 | 还真不小”“地面 | 积 | 了厚厚的雪”),“和软件”则为伪歧义(虽然存在两种不同的切分形式“和软 | 件”和“和软 | 件”,但在真实文本中,无一例外地应被切分为“和 | 软件”)
  • 同属覆盖型,“起身,把手”为真歧义,“平淡,高度,词条 ”则为伪歧义。

如何排除切分歧义

  • 利用词法信息
    湖上有几只美丽的白天鹅
words = segmentor.segment('湖上有几只美丽的白天鹅')  # 分词
print('/'.join(words))

湖/上/有/几/只/美丽/的/白天鹅

  • 利用前趋字串和后继字串在词法、句法、语义、语用三方面的信息。如果交段与其后继字串组成名词,则将该歧义词首字单切,否则,确认该歧义词为词。
  • 利用句法信息。利用歧义字串与前趋字串和后继字串的搭配关系等句法信息确定正确切分,如果歧义字段的直接前趋字串是数词,那么歧义字段的首段单切,否则,该歧义字段成词。
    例:一阵风吹过来了
words = segmentor.segment('一阵风吹过来了')  # 分词
print('/'.join(words))

一阵/风/吹/过来/了

  • 利用语义信息,如果歧义切分字段后继动词的义项中含有动作发出者为“人”这个义素,则歧义字段的尾字单切,否则该歧义字段成词.
    例:学生会兴奋得手舞足蹈
    学生/会/兴奋/得/手舞足蹈
    学生会/兴奋/得/手舞足蹈
words = segmentor.segment('学生会兴奋得手舞足蹈')  # 分词
print('/'.join(words))

学生会/兴奋/得/手舞足蹈

  • 利用语用信息
words = segmentor.segment('日本保留和尚使用的古代庙宇已经不多了')  # 分词
print('/'.join(words))

日本/保留/和尚/使用/的/古代/庙宇/已经/不/多/了

未登录词

  • 未登录词 就是在词典中没有登录过的人名(中国人名和外国人译名), 地名, 机构名,新词语,缩略语等.
  • 歧义切分字段在汉语书面文本中所占的比例并不很大,在实际的书面文本中,特别是在新闻类文本中,未登录词的处理是书面文本自动切分的一个十分突出的问题。这是汉语书面语自动切分的另一个难点.
17 汉语的分词与频度统计(三)

主要的分词方法

正向最大匹配法(MM)

选取包含6-8个汉字的符号串作为最大符号串,把最大符号串与词典中的单词条目相匹配,如果不能匹配,就削掉一个汉字继续匹配,直到在词典中找到相应的单词为止。匹配的方向是从右向左。
例:研究生命科学-〉研究生 命 科学

逆向最大匹配法(RMM)

匹配方向与正向最大匹配法相反,是从左向右。实验表明:对于汉语来说,逆向最大匹配法比正向最大匹配法更有效。

双向匹配法(BM)

比较MM法与RMM法的切分结果,从而决定正确的切分。

最少分词算法

  • 分段
  • 逐段计算最短路径
  • 统计排歧

词网格算法

在这里插入图片描述

17 汉语的分词与频度统计(四)

语料库

大规模用于统计计算语言学研究的机器可读文档

  • 平衡语料库
  • 生语料与熟语料
  • 共时与历时
  • 单语语料库与双语语料库

主要汉语语料库

  • 汉语现代文学作品语料库(1979年),527万字,武汉大学。
  • 现代汉语语料库(1983年),2千万字,北京航天航空大学。
  • 中学语文教材语料库(1983年),106万8千字,北京师范大学。
  • 现代汉语语料库(1983年),180万字,北京语言学院
  • 汉语新闻语料库(1988年),250万字,山西大学,包括4部分:
    《人民日报》:150万字,
    《北京科技报》:20万字;
    《电视新闻》(CCTV):50万字;
    《当代》(杂志):30万字。
  • 北大汉语语料库(1992年):500万词,北京大学。
  • 人民日报语料库
    北京大学计算语言学研究所和日本富士通公司合作,从1999年开始,到2002年完成,原始语料取自1998年全年的《人民日报》,共约2700万字,到2003年又扩充到3500万字,是我国第一个大型的现代汉语标注语料库。

主要英语语料库

  • Brown corpus(1960s-1970s),Brown University
    100万词次,收录1961年美国人写的散文
  • Penn Treebank, Pennsylvania University, text from Wall Street Journal

双语语料库

  • 计算机专业的双语语料库
  • 香港法律文档双语语料库

汉语词汇的频度统计

  • 词频统计是构造统计语言模型的必要步骤
  • N-gram:n元词序列
  • 词频是词典收词的重要参考依据
17 汉语的分词与频度统计(五)

示例:《现代汉语频率词典》(北京语言文化大学,1986)
选取的语料可以分为如下四类:
报刊政论:44万字,占语料总量的24.4%。
科技和科普文章:29万字,占语料总量的19.8%。
口语材料:20万字,占语料总量的11.1%。
文学作品:89万字,占语料总量的48.7%。
整个语料共182万字。这样容量的语料,在当时已经是比较大的语料库了。
《现代汉语频率词典》的编者认为,如果常用词的出现频率不低于百万分之一,也就是在一百万次的场合,常用词的出现机会至少应该有一次,就可以保证统计结果的客观性。《现代汉语频率词典》实际上统计了182万个汉字的语料,因此,其抽样是合理的、经济的、适度的。

  • 词频是(比较)语言学研究的重要依据
    LIVAC(Linguistic variety in Chinese communities)华语共时语料库
    http://www.livac.org/
    香港城市大学 邹嘉彦教授
    其宗旨在于研究使用中文的各个地区使用语言的异同。
    LIVAC的构建:这个语料库从1993年开始策划,在香港、澳门、上海、北京、新加坡和台湾六个不同的地区,每日选定一天的报纸摘录其部分资料入库,资料的内容包括社论、第一版的全部新闻和文章、国际版、地方版、特写、评论等。每天收集的份量约两万字,如果已经达到两万字,不太重要的资料就只好割爱。
    LIVAC规模:从1995年7月到1997年6月的两年内,该语料库所收集的资料总字数为15,234,551字,经过自动切词和人工校对之后总词数约为8,869,900词。到2005年1月为止,已收集了1亿5千多万字。
    基于LIVAC研究:建立了人名库、地名库、专名库、动词词库、形容词词库、各地每月新词词库等多个专项语料库。LIVAC每两星期计算公布双周「名人榜」,年底公布全年「名人榜」,并建立人物褒贬指数的计算。

统计结果表明,中文各地区所使用的词语,以双音节为最多,其次是三音节,再其次是四音节,再再其次是单音节,但是,单音节词语的使用频度却比较高,仅次于双音节词语的频度,而且远远超出其他音节词语频度之总和。

统计结果还表明,香港和澳门的用词相同率最高,香港与台湾、香港与新加坡的用词相同率居第二,香港与上海的用词相同率最低。从历史背景和社会情况来看,这个数字是可以接受的。因为香港与澳门距离很近,又都长期被欧洲国家管制,香港与台湾和新加坡的商务情况和社会结构之间的相同点都比香港与上海之间多,这种情况,在词语中必定会反映出来。

统计结果还表明,新加坡所用词语比较少,而上海的特有词语比较多,这似乎可以从新加坡华语并非当地社会生活的唯一语言,而上海在中国的特殊地位和经济活动非常活跃有关。

汉语词的频度统计

词频反映了国家政策的变化。

村田忠禧的词语分布研究实例:

日本横滨国立大学村田忠禧教授做了很有意义的工作。他从中国共产党第八届至第十一届代表大会政治报告之词语使用频度的变化,来分析中国政治的变化情况。

  • “现代化”这个词在八大、九大、十大的报告中出现频度分别为0次,而在十一大报告中出现8次,在十二大报告中出现29次,在十三大报告中出现45次,在十四大报告中出现59次,在十五大报告中出现40次,反映出我国对于现代化问题由轻视到逐渐重视的发展过程。
  • “改革”这个词,在八大报告中出现23次,在九大报告中出现1次,在十大报告中出现1次,在十一大报告中出现0次,在十二大报告中出现18次,在十三大报告中出现175次,在十四大报告中出现124次,在十五大报告中出现93次,反映了我国在解放之初注意“民主改革”,后来忽视改革,到了十二大特别是到了十三大之后特别重视改革的变化过程;
  • “开放”这个词,在八大、九大、十大、十一大的报告中都出现0次,在十二大报告中出现4次,在十三大报告中出现55次,在十四大报告中出现78次,在十五大报告中出现39次,反映了我国开始逐渐注意开放的过程;
  • “改革开放”这个词语,在八大、九大、十大、十一大、十二大的报告中都出现0次,在十三大报告中出现29次,在十四大报告中出现56次,在十五大报告中出现27次,也反映了我国把“改革”与“开放”并提,并且把“改革开放”作为重要国策的发展过程;
  • “阶级”这个词,在八大报告中出现158次,在九大报告中出现264次,在十大报告中出现70次,在十一大报告中出现247次,在十二大报告中出现40次,在十三大报告中出现18次,在十四大报告中出现13次,在十五大报告中出现9次,反映了我国逐渐改变了“以阶级斗争为纲”这一政治路线的变化过程;
  • “经济建设”这个词语,在八大报告中出现2次,在九大、十大报告中出现0次,在十一大报告中出现1次,在十二大报告中出现9次,在十三大报告中出现13次,在十四大报告中出现24次,在十五大报告中出现8次,反映了我国在解放初期比较重视经济建设,有一段时期忽视经济建设,最后确立了以经济建设为中心的政策的变化过程。

红楼梦作者分析之定量研究

  • 红楼梦一书120回,一般认为前80回为曹雪芹所著,后40回为高鹗所续。如何采用定量分析方法证明这一点?1985年、1986年复旦大学李贤平教授带领他的学生作了这项有意义的工作。
  • 将120回看成120个样本,确定与情节无关的虚词作为变量,让学生数出每一回变量出现的次数,作为数据,用多元分析中聚类分析法进行分类,果然将120回分成前80回为一类,后40回为一类。证明不是出于同一人的手笔。
  • 前80回是否为曹雪芹所写?找到一本曹雪芹的其他著作,做了类似计算,结果证实了用词手法完全相同,断定为曹雪芹一人的手笔。后40回是否为高鹗所写的呢?论证结果推翻了后40回是高鹗一人所写的结论

词频统计示例

马克.土温的《汤姆索耶历险记》(英文)
总共71370个词,其中不相同的词共有8018个(平均每个词使用8.9次,说明该文章比较口语化。

在这里插入图片描述
在这里插入图片描述

17 汉语的分词与频度统计(六)

在这里插入图片描述

统计结果

  • 高频词多为虚词(冠词、连词、介词、助动词、代词等等);低频词多为实词(名词、动词、形容词等等)
  • 绝大多数词汇,无论语料库的规模如何扩大,它们仍然出现次数很少,甚至根本不出现--统计计算语言处理的主要难点之一
  • 最高频的100个词出现的总数占总词数的50.9%
  • 占词表总词数49.8%的词仅仅出现过1次
  • 占词表总词数90%的词出现少于10次

Zipf定律

在Zipf(1902-1950)的《Human Behavior and the Principle of Least Effort》(Zipf 1949)一书中,Zipf发现,在大规模英文文本中对单词进行计数,并从最高频到最低频进行排序,那么其频度近似地服从Zipf定律:f正比于1/r,换句话说,存在一个常数k,使得
f 1 r f\propto \frac{1} {r}
f r = k f\cdot r = k (for constant k)

Zipf曲线

在这里插入图片描述

Mandelbrot’s law

Mandelbrot给出了更为精确的
f = P ( r + q ) B f=P(r+q)^{-B}
其中, P , q , B P,q,B 是与文本有关的常数
关于Zip’s law的一些说明

  • 形如 y = K X c y=KX^{c} 的定律为指数定律
  • Zipf定律就是一种指数定律 c = –1
  • 在对数曲线图上,指数定律为一个斜率为c的直线
    log ( y ) = log ( k x c ) = log ( k ) + c log ( x ) \log (y) =\log (kx^{c}) = \log(k) + c\log(x)
  • 除特高频和特低频词外,词频统计表明Zipf定律成立

Brown数据库统计结果

在这里插入图片描述

Zipf定律的应用

假设汉语中共有词汇10000个,而常用的词汇仅有2000个,那么这频度最高的2000个词占统计语料中总词汇量的比例可以计算如下:
(f(1)+f(2)+…+f(2000))/(f(1)+f(2)+…+f(100000)=C*(1+1/2+1/3+…+1/2000)/(C(1+1/2+…+1/100000))
在这里插入图片描述

Heap’s law

在这里插入图片描述

  • Heap’s law 图例
    在这里插入图片描述
  • Zipf分布和Heap分布
  • 在这里插入图片描述
17 汉语的分词与频度统计(七)

科学的方法,定量的方法

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

  • 林语堂《中国人》
  • 林语堂在西方文坛的成名作和代表作。该书是作者应美国纽约JOHN DAY公司之约,1934年在庐山用英语写成的,1935年由Reynal & Hitchcodk公司出版。

《中国人》选录

  • 在中国人的心灵中,科学方法不能得到发展的原因是很容易理解的,因为科学方法除了要求分析性思维之外,总是免不了要有一些枯燥的工作要做。而中国人则相信自已的庸见与洞察力的闪光。推理的方法在应用到人际关系(中国人最感兴趣的东西)时,常常导致一种愚蠢的结论,这在美国大学里并不罕见。今天有许多用推理方法写成的博士论文,会使长眠在地下的培根感到不安。
  • 没有一个中国人会思索到去写一篇关于冰淇淋的博士论文,并且在一系列的观察与分析之后得出令人瞠目的结论说“糖(在冰淇淋的制作中)最重要的功能是使冰淇淋发甜”;或者在对“四种洗碟方法的时间与运动方法比较”进行研究之后,很高兴地下结论说“弯腰提取物件的动作是很累人的”;或者在对“棉制内衣的细菌含量研究”之后得出结论“细菌的数量随着衣物穿用时间的增加而增加”。几年前有一条消息报道,说芝加哥大学一个学生在对各种印刷方式的效果做了“比较研究”之后,发现线条越黑,越引入注目。
  • 这种愚蠢的结论,尽管对商业广告不无用处,我想靠着中国人的庸见与“直觉”也可以迅速并且正确地获得。我所见到过的最好的漫画要算在《庞其》上发表的,描述一个行为主义者大会的那幅,他们正在几头猪身上做实验。猪嘴上插着温度计,前面挂着一串珍珠项练。试验结束后,他们一致决议猪对珠宝没有反映。这些事情并不纯粹是对科学方法的滥用。
  • 我们知道美国罗彻斯特大学的坎森教授在第九届国际心理学家大会上宣读了一篇论文,题为《论日常烦恼的来源与性质》。他记录了二万一千种烦恼。后来经过筛选,去掉重复的和失误的之后还有507种,之后他又将这些烦恼分级整理,如“食物中发现头发”为26分“,”看到秃顶的人”是2分, “看到蟑螂”为24分。
  • 真正的科学工作自然需要相当的枯燥的劳动。只有真正的科学才能使一个科学家在做出发观之后感到欣慰,比如发现蚯蚓有一种保护性的外衣;因为正是这种细致的观察之后积累起来的事实才使科学一代代地发展,以至取得现在这样辉煌的成就。而中国人缺乏的正是这样一种科学的世界观,有的倒是大量的幽默与庸见。于是,他们自然认为:观察与研究蚯蚓或者金鱼的生活实在是有碍于学者的尊严的。

附:汉语词频统计系统

词条的定义

typedef struct HeadWordItem {
	int                    Wordid;
	unsigned char 		ChineseString[MAXWORDLEN];
    int                   freq;	
} HeadWordItem;

词库的定义

typedef struct Lexicon {
	char LicenseInfo[256];
	int Item_Number_of_Lexicon_Head;
	int Item_Number_of_Lexicon_Body;
	HeadWordItem LexiconHead[HEAD_LEN];
} Lexicon;

词库的创建

Lexicon * lexicon=new Lexicon;
打开文本文件,从文本文件中读取词条,写入lexicon内存区域,关闭文本文件
fopen(…“w+b”)
fwrite(lexicon,sizeof(Lexicon),1,lexiconfile)
fclose(…)

词库的读入

打开二进制文件
fread
关闭二进制文件

分词

1、打开语料库文本文件
2、如果文件未结束,读入一行
3、正向最大匹配分词算法
4、词频计数
5、回到2
6、关闭语料库文本文件

保存结果

以可写入的方式打开二进制词库文件
fwrite
关闭文件

参考文献


  1. 《自然语言处理(哈工大 关毅 64集视频)》(来自互联网) ↩︎

  2. 王晓龙、关毅 《计算机自然语言处理》 清华大学出版社 2005年 ↩︎

  3. 哈工大语言技术平台云官网:http://ltp.ai/ ↩︎

  4. Steven Bird,Natural Language Processing with Python,2015 ↩︎

猜你喜欢

转载自blog.csdn.net/weixin_43935926/article/details/86053733
今日推荐