bluem / teishredder
索引和检索 TEI-XML 文档中的数据
Requires
- php: >=5.3.0
This package is not auto-updated.
Last update: 2020-01-17 13:47:08 UTC
README
这是什么?
TEIShredder 是一组用于索引 TEI XML 文档和检索文本结构(物理和逻辑)、包含的元素、命名实体等信息 PHP 类。从源文档提取的信息被保存在关系数据库中,即这是一种 XML 粉碎形式——因此得名。
TEIShredder 基于为名为“Sandrart.net”的学术项目编写的代码(www.sandrart.net,德国法兰克福歌德大学和意大利佛罗伦萨艺术历史研究所的合作项目,由德国研究协会[DFG]资助),但已被修改为使其成为一个独立的项目/库。同时,该项目原始代码已被 TEIShredder 取代。
系统需求
- PHP 5.3,启用标准扩展
- 关系数据库;已测试 MySQL、PostgreSQL 和 SQLite。这三个数据库的 CREATE 语句可以在“create-*.sql”文件中找到。
使用方法
入门
为了进行第一次快速测试,在 Unix-oid 系统上打开一个 shell(Mac OS X、Linux、BSD 等),“cd” 到 TEIShredder 顶级目录并执行 …
sed 's/<prefix>//g' create-sqlite.sql | sqlite3 test.sqlite
…,这意味着:“将此目录中‘create-sqlite.sql’的内容,从表名中移除 <prefix>,并在该目录中创建一个名为‘test.sqlite’的空 SQLite 数据库,其中包含这些表”。
然后,您可以运行“test.php”,它从“test”目录中获取输入 XML 文件,对其进行索引并将结果保存到该数据库中。(如果您更熟悉 MySQL 或 PostgreSQL 或没有 sqlite3 可执行文件,当然也可以通过更改“test.php”中的 PDO 构造函数使用 MySQL/PgSQL。)然后,它显示收集到的数据信息,例如 TEI 文档中卷的数量和标题、章节的出现次数、命名实体等。
如果您愿意,现在可以检查数据库的内容。例如,您可以通过在 shell 中执行 ... 来查看被索引的元素
sqlite3 test.sqlite 'SELECT * FROM element'
...
TEI != TEI
TEI 可以以许多不同的方式使用。在我看来,这是 TEI 非常吸引人的特性之一,但另一方面,它使得开发通用工具变得更加困难或不可能。TEIShredder 在某种程度上是一个通用工具,因为它仅处理 TEI——但另一方面,它对 TEI 有一定的期望。因此,很可能,TEIShredder 将无法处理您的未经修改的 TEI 文档,但可能需要预处理文档(例如,使用 XSL-T 或 XMLTransformer)以匹配这些期望。
约定/期望
- 如果有多个卷,每个卷都必须被包含在一个 <group> 元素内的 <text> 块中。
- 卷的主要标题被包含在一个 <titlePart> 元素中。期望每个卷都有一个标题,即有一个 <titlePart> 元素。
- 每个卷中不得存在超过一个 <titlePart> 元素。如果有两个或更多,应预处理 XML 或/或子类化 chunker 类,使其在索引时忽略不需要的 <titlePart> 元素。
- 文本结构通过嵌套 <div> 元素编码,其中 <head> 包含章节标题。
- 对列没有特殊处理,只对 <milestone/> 元素进行通用处理。正如 TEI Lite 文档所建议的,应将列编码为 <milestone unit="column" [n="..."]/>。每当 TEIShredder 遇到 <milestone/> 元素(无论它代表的是列或其他参考系统中的变化),都会将 @unit 和 @n(如果两者都存在,则通过 "-" 连接)的值与该元素后面的 XML 段一起保存。
- TEIShredder 预期任何应该被索引的元素都应该有一个 @xml:id 属性,这意味着没有该属性的元素将不会被索引。(索引这样的元素是毫无用处的,因为它无法被引用。)
数据库架构和性能
“create-*.sql” 文件中的语句只是对你可能需要什么的一个猜测。例如,如果你在一个 TEI 文档中有命名实体,但标识符是严格的数字,将实体表中的“identifier”列的数据类型设置为整数可能会有所帮助。而且,如往常一样,索引非常重要。如果你发现某个查询运行时间超过 20 或 30 毫秒,你应该仔细查看数据库的 EXPLAIN 输出,以了解底层的 SQL 查询。此外,如果你认为你的应用程序可能从中受益,你可能还想添加外键约束(例如,在 page.volume 和 volume.number 之间)。