跳转到主要内容

高级语料库语言学

项目描述

Build Status codecov.io readthedocs PyPI version Code style: black

buzz:python语料库语言学

版本 3.1.8

buzz 是一个用于解析和探索纯文本或元数据丰富的文本的语言学工具。此README提供了功能概述。请访问完整文档以获取更完整的使用指南。

安装

buzz 需要 Python 3.6 或更高版本。推荐使用虚拟环境。

pip install buzz[word]
# or
git clone http://github.com/interrogator/buzz
cd buzz
python setup.py install

前端: buzzword

buzz 有一个可选的前端,buzzword,用于探索解析后的语料库。要使用它,安装

pip install buzz[word]

然后,生成一个工作空间,cd 进入它,并启动

python -m buzzword.create workspace
cd workspace
python -m buzzword

更完整的文档可在此处找到,也可从应用程序的主页找到。

将打印一个URL,您可以使用它通过浏览器访问应用程序。

创建语料库

buzz 模型纯文本或CONLL-U 格式文件。本指南的其余部分将假设您拥有纯文本数据,并希望使用 buzz 在命令行上对其进行处理和分析。

首先,您需要确保您的语料库格式和结构是 buzz 可以处理的。这意味着将所有文本文件放入一个文件夹中,并在可选的情况下放入子文件夹中(代表子语料库)。

文本文件应该是纯文本,带有 .txt 扩展名。重要的是,它们可以增强元数据,可以以两种方式存储。首先,可以通过使用大写字母和冒号来添加说话者姓名,就像在剧本中一样。其次,可以使用XML风格的元数据标记。以下是一个示例文件,sopranos/s1/e01.txt

<meta aired="10.01.1999" />
MELFI: My understanding from Dr. Cusamano, your family physician, is you collapsed? Possibly a panic attack? <meta exposition=true interrogative-type="intonation" move="info-request">
TONY: <meta emph=true>They</meta> said it was a panic attack <meta move="refute" /> 
MELFI: You don't agree that you had a panic attack? <meta move="info-request" question=type="in" />
...

如果您在文本文件的开头添加一个 meta 元素,它将被理解为文件级元数据。对于句子特定的元数据,该元素应跟在句子后面,理想情况下在行尾。跨度和标记级元数据应包裹您想要注释的标记。所有元数据以后都可以进行搜索,所以您能添加的越多,您对语料库的使用就越灵活。

将语料库加载为 buzz 对象

from buzz import Corpus

corpus = Corpus("sopranos")

您还可以从字符串创建虚拟语料库,可选地将语料库保存到磁盘。

corpus = Corpus.from_string("Some sentences here.", save_as="corpusname")

解析

buzz 使用 spaCy 来解析您的文本,并将结果保存为 CONLL-U 文件到您的硬盘。默认情况下,解析仅用于依赖关系,但可以通过关键字参数添加成分句法解析

# only dependency parsing
parsed = corpus.parse()
# if you also want constituency parsing, using benepar
parsed = corpus.parse(cons_parser="benepar")
# if you want constituency parsing using bllip
parsed = corpus.parse(cons_parser="bblip")

您还可以解析文本字符串,可选地传递一个名称来保存语料库

from buzz import Parser
parser = Parser(cons_parser="benepar")
for text in list_of_texts:
    dataset = parser.run(text, save_as=False)

使用 buzz 进行解析的主要优点是

  • 解析结果存储为有效的 CONLL-U 2.0
  • 元数据得到尊重,并转移到输出文件中
  • 您可以同时进行成分句法和依赖关系解析(解析树作为 CONLL-U 元数据存储)

parse() 方法返回另一个表示新创建文件的 Corpus 对象。我们可以通过如下的命令来探索这个语料库

parsed.subcorpora.s1.files.e01
parsed.files[0]
parsed.subcorpora.s1[:5]
parsed.subcorpora["s1"]

解析命令

您也可以通过使用 parse 命令来解析语料库,而无需进入 Python 会话

parse --language en --cons-parser=benepar|bllip|none path/to/conll/files
# or 
python -m buzz.parse path/to/conll/files

这两个命令都会创建 path/to/conll/files-parsed,一个包含 CONLL-U 文件的文件夹。

将语料库加载到内存中

您可以使用 load() 方法将整个语料库或部分语料库加载到内存中,作为一个 Dataset 对象,它扩展了 pandas DataFrame

loaded = parsed.load()

您不需要将语料库加载到内存中就可以对其进行操作,但对于小语料库来说这很好。作为一个经验法则,一百万词以下的语料库应该在个人计算机上容易加载。

加载的语料库是一个基于 pandas DataFrame 的 Dataset 对象。因此,您可以在其上使用 pandas 方法

loaded.head()
(此处省略了部分内容) (此处省略了部分内容) (此处省略了部分内容) (此处省略了部分内容) (此处省略了部分内容) (此处省略了部分内容) (此处省略了部分内容) (此处省略了部分内容) (此处省略了部分内容) (此处省略了部分内容) (此处省略了部分内容) (此处省略了部分内容) (此处省略了部分内容) (此处省略了部分内容) (此处省略了部分内容) (此处省略了部分内容) (此处省略了部分内容) (此处省略了部分内容) (此处省略了部分内容) (此处省略了部分内容) (此处省略了部分内容)
(此处省略了部分内容) (此处省略了部分内容) (此处省略了部分内容)
(此处省略了部分内容) 1 1 (此处省略了部分内容) (此处省略了部分内容) (此处省略了部分内容) (此处省略了部分内容) 2 (此处省略了部分内容) _ 10.01.1999 _ 2 (此处省略了部分内容) _ (此处省略了部分内容) (此处省略了部分内容) (此处省略了部分内容) _ 1 14 (此处省略了部分内容) 从您的家庭医生库萨马诺博士那里,我的理解是您晕倒了? 0
2 理解 理解 名词 名词 13 名词主语 _ 10.01.1999 _ 2 (此处省略了部分内容) _ (此处省略了部分内容) (此处省略了部分内容) (此处省略了部分内容) _ 1 14 (此处省略了部分内容) 从您的家庭医生库萨马诺博士那里,我的理解是您晕倒了? 1
3 介词 介词 2 介词 _ 10.01.1999 _ 2 (此处省略了部分内容) _ (此处省略了部分内容) (此处省略了部分内容) (此处省略了部分内容) _ 1 14 (此处省略了部分内容) 从您的家庭医生库萨马诺博士那里,我的理解是您晕倒了? 2
4 博士 博士 专有名词 专有名词 5 复合词 _ 10.01.1999 _ 2 (此处省略了部分内容) _ (此处省略了部分内容) (此处省略了部分内容) (此处省略了部分内容) _ 1 14 (此处省略了部分内容) 从您的家庭医生库萨马诺博士那里,我的理解是您晕倒了? 3
5 库萨马诺 库萨马诺 专有名词 专有名词 3 宾语 _ 10.01.1999 _ 3 B 人物 (此处省略了部分内容) (此处省略了部分内容) (此处省略了部分内容) _ 1 14 (此处省略了部分内容) 从您的家庭医生库萨马诺博士那里,我的理解是您晕倒了? 4

您还可以使用 tabview 通过 view() 方法交互式地探索语料库

loaded.view()

交互式视图有多个酷炫的功能,例如可以根据行或列进行排序。此外,按下一个给定行的 enter 键将基于该行的内容生成一个一致性。真棒!

探索解析和加载的语料库

语料库是一个 pandas DataFrame 对象。索引是一个多索引,由 filenamesent_idtoken 组成。因此,语料库中的每个标记都可通过此索引唯一识别。加载的语料库的列包括所有 CONLL 列,以及任何作为元数据包含的内容。

# get the first sentence using buzz.dataset.sent()
first = loaded.sent(0)
# using pandas syntax to get first 5 words
first.iloc[:5]["w"]
# join the wordclasses and words
print(" ".join(first.x.str.cat(first.w, sep="/")))
"DET/My NOUN/understanding ADP/from PROPN/Dr. PROPN/Cusamano PUNCT/, DET/your NOUN/family NOUN/physician PUNCT/, VERB/is PRON/you VERB/collapsed PUNCT/?

您不需要了解pandas,但是为了使用buzz,因为buzz考虑语言学因素,使得一些度量更加直观。例如,如果您想以某种方式切片语料库,您可以使用justskip属性轻松完成,结合您想要过滤的列/元数据功能。

tony = loaded.just.speaker.TONY
# you can use brackets (i.e. for regular expressions):
no_punct = loaded.skip.lemmata("^[^a-zA-Z0-9]")
# or you can pass in a list/set/tuple:
end_in_s = loaded.just.pos(["NNS", "NNPS", "VBZ"])

buzz创建的任何对象都有一个.view()方法,该方法启动一个tabview交互空间,您可以在其中探索语料库、频率或搭配。

spaCy

spaCy在内部用于依存句法分析,以及其他一些事情。spaCy带来了许多在NLP中的最先进方法。您可以使用以下方法访问您数据的spaCy表示:

corpus.to_spacy()
# or
loaded.to_spacy()

搜索依存关系

要搜索spaCy在解析过程中生成的依存图,您可以使用depgrep方法。

# search dependencies for nominal subjects with definite articles
nsubj = loaded.depgrep('f/nsubj.*/ -> (w"the" & x"DET")')

搜索语言通过模拟节点及其之间的链接来工作。指定一个节点,如f/nsubj/,是通过指定您想要匹配的特征(对于functionf)和斜线内(用于正则表达式)或引号内(用于字面匹配)的查询来完成的。

箭头状链接指定nsubj必须支配限定词。&关系指定两个节点实际上是同一个节点。括号可能是必要的,以包含查询。

这种语言基于Tgrep2语法,针对依存关系进行了定制。它仍在不断发展中,但文档应该可以在这里找到,存储库在这里

钻取

当您搜索CorpusDataset时,结果是另一个Dataset,表示语料库的子集。因此,与其试图构建一个包含您所需一切的查询字符串,通常更容易执行多次小型搜索。

query = 'f/nsubj/ <- f/ROOT/'
tony_subjects = loaded.skip.wordclass.PUNCT.just.speaker.TONY.depgrep(query)

请注意,对于不需要遍历语法结构的任何搜索,您应该使用skipjust方法。tgrepdepgrep仅在您的搜索涉及语法时才需要使用,而不仅仅是标记特征。

搜索依存句法树

目前,由于使用率低(与需要大量特殊处理相结合),此功能已弃用。如果您真的需要此功能,请提出一个问题,我们可以考虑将其恢复,可能通过BLLIP或Benepar。如果您正在制作包含依存句法分析的语料库,请使用parse = (S ...)作为句子级元数据来编码分析。

查看搜索结果

buzz的一个重要原则是搜索和查看结果的分离。与其他许多工具不同,您不是搜索搭配——相反,您搜索语料库,然后可视化数据的输出作为搭配。

搭配

搭配是一种查看结果的好方法。您必须做的事情是告诉buzz您想要匹配列看起来如何——它可以是匹配的单词,也可以是任何组合。要显示单词及其词性,您可以这样做

nsubj = loaded.just.function.nsubj
nsubj.conc(show=["w", "p"])

频率表

您可以在搜索或过滤前后将数据集转换为频率表。表格使用与搭配中show参数类似的show参数,以及额外的subcorpora参数。show表示列的格式,而subcorpora用作索引。以下我们创建了一个以词元形式组织的nsubj标记的频率表,按说话者组织。

tab = nsubj.table(show="l", subcorpora=["speaker"])

对于.table()方法的可能关键字参数如下

参数 描述 默认
subcorpora 用作表格索引的特征。传入多个特征的列表将创建多索引 ['file']
show 用作表格列的功能。传入列表将使用斜杠连接功能,因此['w', 'p']将生成类似'friend/NN'的列名。 ['w']
排序 如何排序结果。'total'/'infreq','increase/'decrease','static/turbulent','name'/'inverse'。 'total'
相对 使用相对频率而不是绝对频率,传入True。您还可以传入Series、DataFrame或buzz对象来计算相对于传入数据的相对频率。 False
remove_above_p 按增加/减少/静态/动荡排序时,计算每个子语料库的频率斜率,以及当零假设无斜率时的p值。如果您传入一个浮点数,则删除p值高于此浮点数的条目。传入True将使用0.05 False
keep_stats 如果为True,则保留与轨迹计算相关的生成统计数据。 False
preserve_case 保留show(列)值的原有大小写。 False
multiindex_columns show是一个具有多个功能的列表时,而不是用斜杠连接show,构建一个多级索引。 False

这创建了一个基于DataFrame的Table对象。您可以使用其.view()方法快速探索结果。在给定频率上按Enter键将显示该条目实例的对照表。

绘图

您还可以使用buzz创建频率数据的优质可视化。这完全依赖于pandas的绘图方法。一个更针对语言数据集的plot方法仍在开发中。

tab.plot(...)

贡献

如果您发现错误,请随意创建一个问题。该项目是开源的,因此也欢迎拉取请求。代码风格是black,版本管理由bump2version处理。

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定选择哪一个,请了解有关安装包的更多信息。

源分发

buzz-3.1.8.tar.gz (78.2 kB 查看散列)

上传时间

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面