高级语料库语言学
项目描述
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 对象。索引是一个多索引,由 filename
、sent_id
和 token
组成。因此,语料库中的每个标记都可通过此索引唯一识别。加载的语料库的列包括所有 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考虑语言学因素,使得一些度量更加直观。例如,如果您想以某种方式切片语料库,您可以使用just
和skip
属性轻松完成,结合您想要过滤的列/元数据功能。
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/
,是通过指定您想要匹配的特征(对于function
为f
)和斜线内(用于正则表达式)或引号内(用于字面匹配)的查询来完成的。
箭头状链接指定nsubj
必须支配限定词。&
关系指定两个节点实际上是同一个节点。括号可能是必要的,以包含查询。
这种语言基于Tgrep2
语法,针对依存关系进行了定制。它仍在不断发展中,但文档应该可以在这里找到,存储库在这里。
钻取
当您搜索Corpus
或Dataset
时,结果是另一个Dataset
,表示语料库的子集。因此,与其试图构建一个包含您所需一切的查询字符串,通常更容易执行多次小型搜索。
query = 'f/nsubj/ <- f/ROOT/'
tony_subjects = loaded.skip.wordclass.PUNCT.just.speaker.TONY.depgrep(query)
请注意,对于不需要遍历语法结构的任何搜索,您应该使用skip
和just
方法。tgrep和depgrep仅在您的搜索涉及语法时才需要使用,而不仅仅是标记特征。
搜索依存句法树
目前,由于使用率低(与需要大量特殊处理相结合),此功能已弃用。如果您真的需要此功能,请提出一个问题,我们可以考虑将其恢复,可能通过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的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 2a23bd715dda5afdb11c0cd1d3da022b9cfcbf64f512904356e1accdb34b7590 |
|
MD5 | 70245b7b113f9734514b678248f74b01 |
|
BLAKE2b-256 | 3b8a4b89bedd054265e213c2be6bb2b2bd2c7867e5f5e773d0c8b4fe4a8c6b3b |