下的多个内文本同时读出
赞
踩
自20世纪80年代以来,随着计算机应用技术的不断发展,世界各大语言都建立了许多不同规模、不同类型的语料库。这些语料库经过深度加工,应用范围也变得越来越广泛,在自然语言处理(NLP)中发挥着越来越重要的作用。因此,语料库已经成为了NLP的重要基础。本章将介绍语料库的基本概念、种类与构建原则,并通过实例介绍NLTK库这一NLP工具的使用,该工具涵盖了大量的数据集。
语料库是指为特定一个或多个应用而专门收集的、具有一定结构和代表性的语料集合,可以被计算机程序检索,并且具有一定规模的数据。
语料库实质上是经过科学取样和加工的大规模电子文本库。它具有以下三个显著特征:
1. 存储的是真实出现过的语言材料。
2. 以计算机为载体,承载语言知识的基础资源。
3. 是对真实语料进行加工、分析和处理的资源。
语料库不仅仅是原始语料的集合,还包括了结构化的语言信息,如语法、语义、语音、语用等。在自然语言处理系统中,使用大量的语言数据或语料是至关重要的,因为语料作为最基本的资源,在不同的自然语言处理系统中发挥着重要作用,构成了各种NLP方法的基础。
首先,语料库在语言研究中发挥着重要作用。它提供了大量真实的语言材料,可以用于句法分析、词法分析、语言理论和语言史研究等领域。同时,语料库也为语义学、语用学、会话分析、言语变体、语音科学和心理学等领域的研究提供了支持。
其次,语料库被广泛应用于编纂工具和参考书籍的制作。许多对语言教学有影响力的词典和语法书都是在语料库的基础上编写的。通过统计语料库中最常用的词汇、成语、搭配和例句等信息,这些参考书籍能够更准确地反映实际语言使用情况。
第三,语料库在语言教学中起到了积极作用。它可以帮助缩小课堂学习与实际使用之间的差距,揭示过去被忽视的语言规律,更准确地理解词语在实际交际中的意义和用法,并发现学习者在语言使用过程中存在的问题。此外,语料库还可用于语言测试和分析语言错误等方面。
最后,语料库在自然语言处理(NLP)中发挥着重要作用。经过加工处理的语料库可以应用于NLP的各个层面研究,包括词法分析、拼写检查、全文检索、词频统计、机器翻译等。通过语料库的语法标注和语义标注,可以进行语法检查、词义排除、改进名词短语辨识和机器翻译等任务。此外,语料库还可以解决指代问题、时态分析、目的识别、文本摘要和文本生成等语篇层面的任务。
语料库的类型主要根据其研究目的和用途进行划分。根据不同的标准,语料库可以被归类为多种类型。举例而言,按照语言种类划分,语料库可以分为单一语种语料库和多语种语料库;按照记录媒介的不同,语料库可以分为单一媒体语料库和多媒体语料库;按照地域差异,语料库可以分为国家语料库和国际语料库等。
将语料库按照其结构划分为平衡结构语料库和自然随机结构语料库,按照用途划分为通用语料库和专用语料库,按照选取时间划分为共时语料库和历时语料库。
1. 平衡结构语料库与自然随机结构语料库
平衡结构语料库注重语料的代表性和平衡性,需要事先设计语料库中不同类型的语料,确定每种类型的语料所占比例,并按比例采集形成语料库。举例来说,布朗语料库是历史上首个机读语料库,代表了平衡结构语料库,按三层分类严格设计了每类语料的比例。自然随机结构语料库则按照某种原则随机收集语料,如《圣经》语料库、狄更斯作品语料库、英国知名作家作品库以及北京大学开发的《人民日报》语料库等。
2. 通用语料库与专用语料库
通用语料库和专用语料库根据不同的使用目的而划分。通用语料库没有特定限制,而专用语料库的选择可能仅限于某一领域,为特定目的而采集。专用语料库由某一特定领域、地区、时间、类型的语料组成,例如新闻语料库、科技语料库、中小学语料库、北京口语语料库等。通用领域和专用领域是相对概念。
3. 共时语料库与历时语料库
共时语料库旨在进行语言共时研究,即研究同一时间平面上元素或元素关系的语言现象。共时研究建立的语料库称为共时语料库,例如泛华语中文地区汉语共时语料库(LiVac),采用共时性视角分析具有代表性的中文媒体语料。历时语料库则旨在进行语言历时研究,探讨一个时间切面中元素与元素关系的演变。举例来说,国家现代汉语语料库由原国家语委建设,收录了1919年至今的现代汉语代表性语料,是典型的历时语料库。历时语料库的统计结果根据时间轴等距抽样得到的频次变化形成走势图。
语料库的构建需要考虑以下四个原则:
1. 代表性:语料库应在一定的抽样框架范围内采集样本语料,以尽可能多地反映真实语言现象和特征。这意味着语料库应该具有广泛的覆盖性,可以包括不同领域、不同年代、不同地区、不同作者等不同维度的语料。
2. 结构性:语料库应采用计算机可读的电子文本形式,以便进行有效的处理和分析。语料库的结构包括语料记录的代码、元数据项、数据类型、数据宽度、取值范围和完整性约束等信息。
3. 平衡性:语料库中的语料应考虑不同内容或指标的平衡性。这包括学科、年代、文体、地域、使用者的年龄、性别、文化背景、阅历和语料的用途等因素。在建立语料库时,需要选择一个或多个重要的指标作为平衡因子,以确保语料库具有平衡性。
4. 规模性:语料库的规模应根据实际需求确定。大规模的语料库对语言研究和自然语言处理研究具有重要作用,但随着规模的增大,垃圾语料带来的统计垃圾问题也会增加。此外,随着规模的增长,语料库的功能也需要相应地进行管理和控制。因此,在使用语料库时,应根据具体需求确定合适的规模。
NLTK(Natural Language Toolkit)是一个用于构建处理自然语言数据的Python应用开源平台,也是基于Python编程语言实现的NLP库。
NLTK提供了超过50个素材库和词库资源的接口,涵盖了分词、词性标注、命名实体识别、句法分析等各项NLP领域的功能。它支持NLP和教学研究,收集了大量公开数据集和文本处理库,可用于文本分类、符号化、提取词根、贴标签、解析及语义推理等任务。
NLTK是当前最流行的自然语言编程与开发工具之一。利用NLTK提供的函数,可以显著提高进行NLP研究和应用时的效率。以下是NLTK的一些模块及其功能描述:
1.进入NLP虚拟环境。在Anaconda Prompt的命令行输入以下命令: activate NLP
进入到所创建的NLP虚拟环境里面,当路径显示根目录由转变为,说明成功进入。
2.安装NLTK库。在Anaconda Prompt的NLP虚拟环境里面输入以下命令: conda install nltk
若出现确认信息,输入y
3.检查是否存在nltk库。输入以下命令: conda list
存在nltk库,安装成功。
4.下载NLTK数据包。在成功安装NLTK库后,打开python编辑器Spyder,输入以下命令
import nltk
nltk.download()
下载NLTK数据包(如图所示),选中book(里面包含了数据案例和内置函数),点击左下角下载,请复制底部下载路径如C:\Users\lll\AppData\Roaming\nltk_data,后续使用。下载进度条满后即可进行下一步操作
我们此时下载完毕,book数据包下载完成后,还需要进行环境变量的配置:计算机→属性→高级系统设置→高级→环境变量→系统变量→path,输入下载路径(注意是系统变量,选择path新建):
C:\Users\lll\AppData\Roaming\nltk_data
需要注意的是:因为下载需要访问GitHubhttps://raw.githubusercontent.com/nltk/nltk_data/gh-pages/index.xml
需要挂加速器,这里我使用的是Watt Toolkit,在微软商店下载然后使用其中的加速功能注意勾选GitHub加速,也可以使用其他加速器。
5.检查NLTK数据包是否安装成功。在编辑器Spyder界面输入以下命令
from nltk.book import *
返回如下说明安装成功在成界面会显示NLTK当中 Book数据包的介绍示例文本,text1至text9分别是:《白鲸记》、《理智与情感》、《创世纪》、就职演说语料库、聊天语料库、《巨蟒与圣杯》、华尔街日报、科尔普斯人物以及《代号星期四》
以下将以《白鲸记》为例来介绍在NLTK中定义的基本函数使用。 首先导入NLTK模块和加载book模块下的全部文件:
- import nltk
- from nltk.book import *
-
- # similar函数的使用示例
- print("与 'pretty' 相似的词语有:")
- text1.similar('pretty')
-
- # concordance函数的使用示例
- print("\n包含 'danger' 的上下文:")
- text1.concordance(word='danger')
-
- # collocations函数的使用示例
- print("\n常出现的搭配词语:")
- text1.collocations()
-
- # 计算词频并进行统计和展示
- fdist = FreqDist(text1)
- print("\n'ship' 出现的次数:", fdist['ship'])
-
- # 输出频率最高的10个词汇和词频统计
- print("\n频率最高的10个词汇及其出现次数:")
- voc = fdist.most_common(10)
- print(voc)
-
- # 统计词汇总数和词汇表大小,并计算每个词平均使用次数
- total_words = len(text1)
- unique_words = len(set(text1))
- average_usage = total_words / unique_words
- print("\n总词汇数:", total_words)
- print("词汇表大小:", unique_words)
- print("每个词平均使用次数:", average_usage)
-
- # 使用plot函数画出频率累积图
- fdist.plot(30, cumulative=True)
similar函数:
similar(word)
,其中word
是要查找相似词语的单词。text1.similar('pretty')
concordance函数:
concordance(word)
,其中word
是要搜索的单词。text1.concordance(word='danger')
collocations函数:
collocations()
text1.collocations()
FreqDist函数:
FreqDist
类创建一个频率分布对象,然后调用对象的方法进行操作。fdist = FreqDist(text1)
most_common方法:
most_common(n)
,其中n
是要获取的前n个词汇的数量。voc = fdist.most_common(10)
len函数:
len(object)
,其中object
是要计算长度的对象。len(text1)
set函数:
set(sequence)
,其中sequence
是要转换的序列。set(text1)
plot方法:
plot(num, cumulative)
,其中num
是要显示的前n个词汇,cumulative
表示是否累积频率。fdist.plot(30, cumulative=True)
NLTK 提供了各种各样的语料库和函数,用于处理文本数据、分词、词性标注、语法分析、语义分析等。以下是 NLTK 中一些常用的基本语料库和函数:
笔者常用的在线语料库的获取
中文语料库:
中文语言资源联盟: http://www.chineseldc.org/
语料库语言学在线:http://www.corpus4u.org/
中文自然语言处理语料库项目:https://github.com/brightmart/nlp_chinese_corpus
英文语料库:
古藤堡语料库:http://www.gutenberg.org/
美国国家语料库:http://www.anc.org
实例1.在线获取古藤堡语料库文本(Gutenberg)
- import nltk
-
- # 加载nltk包
-
- # 使用corpus模块中的gutenberg语料库
- from nltk.corpus import gutenberg
-
- # 获取古藤堡语料库中的所有文本文件名
- file_ids = nltk.corpus.gutenberg.fileids()
-
- # 输出获取到的文本文件名
- print("古藤堡语料库的所有文本文件名:", file_ids)
输出结果如下:
古藤堡语料库的所有文本文件名: ['austen-emma.txt', 'austen-persuasion.txt', 'austen-sense.txt', 'bible-kjv.txt', 'blake-poems.txt', 'bryant-stories.txt', 'burgess-busterbrown.txt', 'carroll-alice.txt', 'chesterton-ball.txt', 'chesterton-brown.txt', 'chesterton-thursday.txt', 'edgeworth-parents.txt', 'melville-moby_dick.txt', 'milton-paradise.txt', 'shakespeare-caesar.txt', 'shakespeare-hamlet.txt', 'shakespeare-macbeth.txt', 'whitman-leaves.txt']
运行结果显示的是nltk包含的语料库文本,可以对其中的任意文本进行操作。
如查找某个文件,统计词数以及索引文本:
- import nltk
-
- # 从古藤堡语料库中加载"Austen-Emma"文本
- emma_words = nltk.corpus.gutenberg.words('austen-emma.txt')
-
- # 打印加载的文本
- print("加载的文本:", emma_words)
-
- # 统计文本中的词数
- word_count = len(emma_words)
- print("词数:", word_count)
-
- # 索引文本以便进行更多的文本操作
- emma_text = nltk.Text(emma_words)
-
- # 展示全文中所有出现 "surprise" 的地方及其上下文
- emma_text.concordance("surprise")
获取文本的标识符、词、句:
- from nltk.corpus import gutenberg
-
- # 遍历古藤堡语料库中的每个文件
- for fileid in gutenberg.fileids():
- # 获取当前文件的原始文本
- raw = gutenberg.raw(fileid)
- # 计算原始文本的字符数
- num_chars = len(raw)
-
- # 获取当前文件的单词列表
- words = gutenberg.words(fileid)
- # 计算当前文件的单词数
- num_words = len(words)
-
- # 获取当前文件的句子列表
- sents = gutenberg.sents(fileid)
- # 计算当前文件的句子数
- num_sents = len(sents)
-
- # 使用set将单词列表转换为词汇表,并且将单词转换为小写以避免重复计数
- vocab = set([w.lower() for w in gutenberg.words(fileid)])
- # 计算当前文件的词汇表大小
- num_vocab = len(vocab)
-
- # 格式化输出当前文件的统计信息
- print("文件名: {}".format(fileid))
- print("字符数: {}".format(num_chars))
- print("单词数: {}".format(num_words))
- print("句子数: {}".format(num_sents))
- print("词汇表大小: {}".format(num_vocab))
- print("---------------------------------------------")
访问在线古藤堡语料库,获取HTML文本。以获取《西游记》为例。
- import re
- from urllib.request import urlopen
-
- # 导入正则表达式库和 urllib 中的 urlopen 函数
-
- # 定义《西游记》文本的 URL 地址
- url = 'http://www.gutenberg.org/cache/epub/23962/pg23962.html'
-
- # 使用 urlopen 函数打开指定 URL 地址,并读取其内容
- html_content = urlopen(url).read()
-
- # 将获取到的 HTML 数据进行 UTF-8 解码,以便后续处理中能够正确处理中文字符
- decoded_html_content = html_content.decode('utf-8')
-
- # 输出部分内容进行查看
- print(decoded_html_content[7500:8000])
结果如下:
结果上还有许多HTML 符号,这些可以通过正则表达式等数据处理手段整理得到所需要的文本。
实际上语料库不一定得使用构建好的官方语料库,任意一个文本数据集都能成为语料库,许多研究者和开发者都会根据自己的需求和研究目的来创建自定义的语料库,这些语料库可以是从网络上抓取的文本、特定领域的文档、书籍、新闻文章等等。
下面实战构建一个本地语料库
1. 构建本地语料库
下载斗罗大陆的部分作品集的部分文本,完成数据采集和预处理工作。构建本地语料库命令如下:
- import nltk
- from nltk.corpus import PlaintextCorpusReader
- import jieba
- import re
-
- # 本地存放斗罗大陆部分作品集文本的目录
- corpus_root = r'C:/Users/lll/Downloads/斗罗大陆语料库'
-
- # 载入本地语料库
- wordlists = PlaintextCorpusReader(corpus_root, '.*')
-
- # 获取文件列表
- wordlists.fileids()
-
- # 读取文本内容
- with open(r'C:/Users/lll/Downloads/斗罗大陆语料库/斗罗大陆.txt','r',encoding='utf-8') as f:
- text = f.read()
-
- # 统计用词量
- vocab_count = len(set(text))
- print("用词量:", vocab_count)
-
- # 计算平均每个词的使用次数
- avg_word_frequency = len(text) / vocab_count
- print("平均每个词的使用次数:", avg_word_frequency)
-
- # 统计关键词出现次数
- print("小舞 出现次数:", text.count('小舞'))
- print("三哥 出现次数:", text.count('三哥'))
- print("武魂 出现次数:", text.count('武魂'))
- print("唐门 出现次数:", text.count('唐门'))
-
- # 统计前30个高频词或高频标识符
- fdist = nltk.FreqDist(text)
- print("前30个高频词或高频标识符:", fdist.most_common(30))
-
- # 查询不同词频范围的词量
- W = nltk.Counter(text)
- print("词频在0~100的词量:", len([w for w in W.values() if w < 100]))
- print("词频在100~1000的词量:", len([w for w in W.values() if 100 <= w < 1000]))
- print("词频在1000~5000的词量:", len([w for w in W.values() if 1000 <= w < 5000]))
- print("词频在5000以上的词量:", len([w for w in W.values() if w >= 5000]))
-
- # 清洗数据,只保留中文字符
- cleaned_data = ''.join(re.findall(r'[\u4e00-\u9fa5]', text))
-
- # 使用结巴分词处理文本
- wordlist = jieba.lcut(cleaned_data)
-
- # 封装成nltk.Text对象
- text = nltk.Text(wordlist)
-
- # 输出文本对象
- print(text)
-
- # 查询关键词的上下文
- print("查询与指定关键词上下文:")
- text.concordance(word='丰满', width=100, lines=5)
- print("查询与指定关键词相似的词语:")
- # 查询与指定关键词相似的词语
- text.similar(word='武魂', num=10)
-
- # 绘制关键词的分布图
- import matplotlib.pyplot as plt
- plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文字体为黑体
- words=['小舞', '三哥', '武魂', '唐门']
- text.dispersion_plot(words)
- plt.show()
结果如上
通过该构建了一个简单的自定义本地语料库,统计了关键词以及词频等信息。下一章会介绍正则表达式等技术来处理爬取数据。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。