面向机器学习的自然语言标注3.2 计算出现次数

本文涉及的产品
NLP 自学习平台,3个模型定制额度 1个月
NLP自然语言处理_高级版,每接口累计50万次
NLP自然语言处理_基础版,每接口每天50万次
简介:

3.2 计算出现次数

当我们将语言学文本放在一起形成语料库时,在检查语料库前,我们很可能不知道一个具体语言现象的概率分布。例如,如果没有统计每个题材的评论数量,我们不可能知道在IMDb语料库中出现动作类电影评论的概率。在现实中,没有一个语料库会如此平衡。通过对数据集(这里,数据集包含动作类、喜剧类等类型的电影评论)中相关对象出现次数的计数,构成对语料库的统计。类似地,在检查语料库的语言学内容时,我们事先不可能知道语料库中不同单词的频率分布。

在把任何一种机器学习算法应用于语料库前,应该知道的最重要的一件事是语料库所包含的单词的基本统计信息。语料库本质上就像一本教科书,学习算法将用它作为样本(正样例)进行训练。如果你不知道单词的分布(或任何感兴趣的东西),那么你就不知道教科书提供了哪些可以学习的内容。语料库中词型(word type)的分布通常是不均衡的,如图3-1所示。Madnani(2012)提供了如何为语料库生成这种图表的指南。

 

图3-1:NLTK Gutenburg语料库中的频率分布

首先澄清一点。当我们说正在计算语料库中的“单词”时,我们需要明白其中的含义。词频指的是词例(即词型或词干的实例)的个数。所以,我们应该正确地说明下面这句话中有8个单词还是11个单词。这取决于“单词”的含义。

“The cat chased the mouse down the street in the dark.”

可以直接用NLTK对语料库进行词频计算。图3-2显示了IMDb语料库的一些例子。弄清楚数据集中哪些单词或短语最常用,有助于深入理解你正在使用的语料库。这里,我们给出可用于查找文本文件中50个最常见单词的源代码。

 

图3-2 :IMDb语料库中的频率分布

 

关于NLTK搭配函数的使用说明可参见http://nltk.googlecode.com/svn/trunk/doc/howto/collocations.html.

这里给出在语料库上进行词法统计时需要用到的两个基本概念:

语料库大小(N)

语料库中词例的个数。

词汇表大小(V)

语料库中词型的个数。

对任一个经过分词的语料库,都可以将每一个词例映射为一个词型,例如the出现的次数(词型the的词例个数)等。获得语料库词频分布后,可以计算两个指标:排序/频率分布(rank/frequency profile)和词频的频谱(frequency spectrum)。

为得到排序/频率分布,需要从词频列表中取出词型并用其排序替换它,最常见的词型排序是1,以此类推。为生成频谱,简单地计算具有某一频率的词型的个数即可。在这两个指标的计算结果中最明显的一点是,最高频率的排序总是被功能词(function word)(即the、a和and之类的词以及介词等)占据。在布朗语料库中,位列前10的单词占语料库大小的23%(Baroni 2009)。另一个发现是排序较低的单词在频率上呈现出许多联系。例如,在IMDb语料库的频率表中,罕用语(语料库中仅出现一次的单词)数量超过8000。在布朗语料库中,大约一半的单词只出现一次。均值或平均频率的背后隐藏着巨大的差异。在布朗语料库中,词型的平均频率是每个词型出现19次,但该均值之所以如此之大是因为少量极高频词导致的。

我们也注意到语料库中的大部分单词的词频都远低于均值,所以均值比中位数高得多,尽管众数(mode)通常为1。所以,均值对“集中趋势”并不是一个很有意义的指标,对更大规模的语料库来说更是如此。

注意:回忆下面几个统计学概念之间的区别:

·均值(平均数):值的和除以值的个数       

 

·众数:总体(或数据集)中最常见的值。

·中位数:总体(或样本)的中间数,它将样本集分为比它大的一半和比它小的一半。

3.2.1 齐普夫定律(Zip's Law)

上节提到词型的不均衡分布是乔治·齐普夫(George Zipf)根据对各种数据集的观察在1949年首次提出的。他注意到,语料库中一个词的频率f(w)是这个词的排序r(w)的非线性递减函数,可以表示为下面这两个变量之间的函数关系:

 

C是一个常数,由语料库的具体情况决定,但现在我们可以认为它是语料库中最高频单词的频率。假设a是1,那么我们很快就可以看到频率是如何随排序递减的。注意,该规律是一个幂次定律(power law):频率是排序的负次幂(-a)的函数。所以,排在第一位的词出现的次数通常是排在第二位的词出现次数的两倍以及第三位的三倍,以此类推。

3.2.2  n元语法

本节介绍n元语法的概念。n元语法对自然语言处理(NLP)的许多应用都很重要,因为可以通过它们构造非常直观的语言模型(language model),用于语音识别与合成、机器翻译、索引、信息检索(IR)以及接下来我们将要看到的分类。

设想我们有一个词例(token)字符串W,由元素w1, w2, ? wn组成。现在考虑W上的滑动窗口。如果滑动窗口由一元子串(wi)组成,则这些一元子串的集合称为字符串的一元(unigram)表示;字符串中元素的个数与一元表示的个数相同。现在考虑所有的二元子串,有w1w2、w2w3等,直到最后的wn-1wn,这些称为二元(bigram)表示,对于一个长度为n的字符串,我们有n-1个二元表示。

根据之前提到的条件概率的定义,可以将已知前一个词例的条件下出现当前词例的概率定义为二元概率(bigram probability)。因此,已知前一个元素wi-1,元素wi的条件概率为:

 

将滑动窗口进一步扩大,已知前n-1个元素,可以定义n元概率为该元素的条件概率。即,

 

在任何语料库中最常见的二元子串很可能不是你所感兴趣的。它们涉及词对中频次最高的那些。这通常是烦人的功能词词对,例如,

of the

in the

on the

in a

如果你想得到更有意义的二元(和三元)子串集合,可以在语料库上运行词性(POS)标注器,比如通过NLTK提供的某个词性标注器。这样能够过滤一些二元子串得到更多的实义词词对,例如,形容词和名词:

Star Trek

Bull Run

Sidekick Brainiac

这是从结果中过滤无意义的n元子串的有效方式。但更好的解决方法是利用n元子串中词语之间的“自然亲和力”。这个方法涉及所谓的搭配(collocation)。搭配是语言中两个或以上单词远超偶然共现的频繁共现。在语料库中寻找搭配的一种有效方法是计算点互信息(Pointwise Mutual Information,PMI)。大体而言,PMI背后的直觉如下:对两个单词X和Y,我们想知道一个单词能告诉我们另一个单词多少信息。例如,给定X的一次出现x和Y的一次出现y,它们的联合概率与假设它们彼此独立时的期望值之间有多大差异?这可以表示为:

pmi

实际上,NLTK所提供的搭配函数也是利用该关系构造二元搭配。将该函数应用于IMDb语料库的二元子串,可看到如下的结果:

>>> bigram_measures = nltk.collocations.BigramAssocMeasures()

>>> finder1 = BigramCollocationFinder.from_words(imdbcorpus.words())

>>> finder1.nbest(bigram_measures.pmi, 10)

[('".(', 'Check'), ('10th', 'Sarajevo'), ('16100', 'Patranis'),

('1st', 'Avenue'), ('317', 'Riverside'), ('5000', 'Reward'),

('6310', 'Willoughby'), ('750hp', 'tire'), ('ALEX', 'MILLER'),

('Aasoo', 'Bane')]

>>> finder1.apply_freq_filter(10) #look only at collocations that occur 10 times or more

>>> finder1.nbest(bigram_measures.pmi, 10)

[('United', 'States'), ('Los', 'Angeles'), ('Bhagwan', 'Shri'),

('martial', 'arts'), ('Lan', 'Yu'), ('Devi', 'Maa'),

('New', 'York'), ('qv', ')),'), ('qv', '))'), ('I', ")'")]

>>> finder1.apply_freq_filter(15)

>>> finder1.nbest(bigram_measures.pmi, 10)

[('Bhagwan', 'Shri'), ('Devi', 'Maa'), ('New', 'York'),

('qv', ')),'), ('qv', '))'), ('I', ")'"), ('no', 'longer'),

('years', 'ago'), ('none', 'other'), ('each', 'other')]

然而,使用这个简单公式将涉及数据稀疏问题。即,过高估计了观测到的罕见事件的概率,而过低估计了未观测到的事件的概率。计算语言学的研究人员已经找到许多可以在一定程度上缓解该问题的方法,我们将在第7章讨论机器学习算法时再来详细讨论该问题。

相关文章
|
26天前
|
机器学习/深度学习 人工智能 自然语言处理
探索机器学习中的自然语言处理
在这篇文章中,我们将深入探讨自然语言处理(NLP)在机器学习中的应用。NLP是人工智能的一个分支,它使计算机能够理解、解释和生成人类语言。我们将通过Python编程语言和一些流行的库如NLTK和spaCy来实现一些基本的NLP任务。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息。
|
1月前
|
机器学习/深度学习 自然语言处理 语音技术
探索机器学习中的自然语言处理技术
【10月更文挑战第38天】在本文中,我们将深入探讨自然语言处理(NLP)技术及其在机器学习领域的应用。通过浅显易懂的语言和生动的比喻,我们将揭示NLP技术的奥秘,包括其工作原理、主要任务以及面临的挑战。此外,我们还将分享一些实用的代码示例,帮助您更好地理解和掌握这一技术。无论您是初学者还是有经验的开发者,相信您都能从本文中获得宝贵的知识和启示。
39 3
|
2月前
|
机器学习/深度学习 程序员
【机器学习】朴素贝叶斯原理------迅速了解常见概率的计算
【机器学习】朴素贝叶斯原理------迅速了解常见概率的计算
|
4月前
|
机器学习/深度学习 自然语言处理 算法
【数据挖掘】百度机器学习-数据挖掘-自然语言处理工程师 历史笔试详解
文章汇总并解析了百度机器学习/数据挖掘工程师/自然语言处理工程师历史笔试题目,覆盖了多分类任务激活函数、TCP首部确认号字段、GMM-HMM模型、朴素贝叶斯模型、SGD随机梯度下降法、随机森林算法、强连通图、红黑树和完全二叉树的高度、最长公共前后缀、冒泡排序比较次数、C4.5属性划分标准、语言模型类型、分词算法、贝叶斯决策理论、样本信息熵、数据降维方法、分箱方法、物理地址计算、分时系统响应时间分析、小顶堆删除调整等多个知识点。
49 1
【数据挖掘】百度机器学习-数据挖掘-自然语言处理工程师 历史笔试详解
|
4月前
|
机器学习/深度学习 数据采集 自然语言处理
打造个性化新闻推荐系统:机器学习与自然语言处理的结合Java中的异常处理:从基础到高级
【8月更文挑战第27天】在信息过载的时代,个性化新闻推荐系统成为解决信息筛选难题的关键工具。本文将深入探讨如何利用机器学习和自然语言处理技术构建一个高效的新闻推荐系统。我们将从理论基础出发,逐步介绍数据预处理、模型选择、特征工程,以及推荐算法的实现,最终通过实际代码示例来展示如何将这些理论应用于实践,以实现精准的个性化内容推荐。
|
4月前
|
机器学习/深度学习 人工智能 自然语言处理
探索机器学习在自然语言处理中的应用
【8月更文挑战第22天】本文将深入探讨机器学习技术如何革新自然语言处理领域,从基础概念到高级应用,揭示其背后的原理和未来趋势。通过分析机器学习模型如何处理、理解和生成人类语言,我们将展示这一技术如何塑造我们的沟通方式,并讨论它带来的挑战与机遇。
|
4月前
|
机器学习/深度学习 人工智能 自然语言处理
探索机器学习中的自然语言处理技术
【7月更文挑战第40天】 随着人工智能的迅猛发展,自然语言处理(NLP)作为机器学习领域的重要分支,正逐渐改变我们与机器的互动方式。本文将深入探讨NLP的核心概念、关键技术以及在现实世界中的应用案例。我们将从基础原理出发,解析NLP如何处理和理解人类语言,并讨论最新的模型和算法如何提升NLP的性能。最后,通过几个实际应用场景的分析,展望NLP在未来可能带来的变革。
|
5月前
|
机器学习/深度学习 自然语言处理 数据挖掘
探索机器学习中的自然语言处理技术
【7月更文挑战第31天】本文深入探讨了自然语言处理(NLP)在机器学习领域的应用,包括其定义、重要性以及面临的挑战。文章进一步介绍了NLP的基本任务和常用技术,并通过实例展示了如何利用这些技术解决实际问题。最后,本文展望了NLP的未来发展方向和潜在影响。
|
4月前
|
机器学习/深度学习 自然语言处理 算法
【数据挖掘】百度机器学习-数据挖掘-自然语言处理工程师 2023届校招笔试详解
百度2023届校招机器学习/数据挖掘/自然语言处理工程师笔试的题目详解
90 1
|
5月前
|
机器学习/深度学习 人工智能 自然语言处理
探索机器学习中的自然语言处理技术
【7月更文挑战第25天】自然语言处理(NLP)是机器学习领域的一个重要分支,它致力于让计算机能够理解、解释和生成人类语言。本文将深入探讨NLP的基本原理、关键技术以及在现实世界中的应用实例,旨在为读者提供一个全面的NLP技术概览,并展示其在现代科技中的重要性和应用前景。

热门文章

最新文章