<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>数字人文 |</title><link>https://clementgodbarge.com/zh/tag/%E6%95%B0%E5%AD%97%E4%BA%BA%E6%96%87/</link><atom:link href="https://clementgodbarge.com/zh/tag/%E6%95%B0%E5%AD%97%E4%BA%BA%E6%96%87/index.xml" rel="self" type="application/rss+xml"/><description>数字人文</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>zh-cn</language><lastBuildDate>Tue, 05 May 2026 00:00:00 +0000</lastBuildDate><image><url>https://clementgodbarge.com/media/icon_hu_64a6c3bec25b3d7b.png</url><title>数字人文</title><link>https://clementgodbarge.com/zh/tag/%E6%95%B0%E5%AD%97%E4%BA%BA%E6%96%87/</link></image><item><title>tei-mcp v0.3：编码TEI，不动源文本一字</title><link>https://clementgodbarge.com/zh/post/tei-mcp-span-locked/</link><pubDate>Tue, 05 May 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/zh/post/tei-mcp-span-locked/</guid><description>&lt;p&gt;我
时，目标是阻止AI助手幻觉出TEI标记。模式锚定解决了一部分问题：有了对P5规范的直接、基于工具的访问，模型不必再猜一个元素是什么意思、能带哪些属性。输出能通过验证。&lt;/p&gt;
&lt;p&gt;但在TEI编码里，幻觉有两副面孔，模式只抓得住一副。依规范验证，只能告诉您&lt;em&gt;标记&lt;/em&gt;是否合式；至于标记包裹的&lt;em&gt;文本&lt;/em&gt;，它一言不发。而破坏性更大的幻觉，恰恰就藏在文本本身里。v0.3的头号新功能——区间锁定合成（span-locked composition）——正是专为防范这类幻觉而设计的。&lt;/p&gt;
&lt;details class="print:hidden xl:hidden" &gt;
&lt;summary&gt;目录&lt;/summary&gt;
&lt;div class="text-sm"&gt;
&lt;nav id="TableOfContents"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#模式抓不住的幻觉"&gt;模式抓不住的幻觉&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#区间锁定合成"&gt;区间锁定合成&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#它是什么不是什么"&gt;它是什么，不是什么&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#为什么意义不止于tei"&gt;为什么意义不止于TEI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#获取更新"&gt;获取更新&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/nav&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id="模式抓不住的幻觉"&gt;模式抓不住的幻觉&lt;/h2&gt;
&lt;p&gt;让模型编码一封十六世纪的法文信，您往往会拿到一份看上去无可挑剔的TEI文档：头部填得满满当当，&lt;code&gt;&amp;lt;persName&amp;gt;&lt;/code&gt;标签放得恰到好处，&lt;code&gt;&amp;lt;dateline&amp;gt;&lt;/code&gt;合式规整。用&lt;code&gt;validate_document&lt;/code&gt;跑一遍，通过。&lt;/p&gt;
&lt;p&gt;然后拿正文和源文本比一比。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;mesme&lt;/code&gt;变成了&lt;code&gt;même&lt;/code&gt;。一个逗号挪了窝。&lt;code&gt;luy&lt;/code&gt;被悄悄现代化成了&lt;code&gt;lui&lt;/code&gt;。手稿里一处难以辨认的分句，被“修正”成了更通顺的样子。这些改动没有一处是您要求的，也没有一处被标出来。文档在模式上有效，却错得悄无声息。&lt;/p&gt;
&lt;p&gt;对档案工作流来说——编码后的文本将成为永久记录，下游的读者、检索索引和引用都要倚赖它——这才是最要命的失效方式。标签格式不对，不过是烦人；一处五年没人发现的现代化拼写，就是讹误。&lt;/p&gt;
&lt;h2 id="区间锁定合成"&gt;区间锁定合成&lt;/h2&gt;
&lt;p&gt;新版本（v0.3）带来了一套直指这一失效方式的幻觉防范机制。设计目标是让正文幻觉从构造上就不可能发生，而不只是不大可能。&lt;/p&gt;
&lt;p&gt;思路很简单：&lt;strong&gt;模型从不键入正文&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;取而代之的工作流是这样的：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;模型调用&lt;code&gt;get_source(&amp;quot;letter_001&amp;quot;)&lt;/code&gt;，取得源纯文本，一个不可变的字符串。&lt;/li&gt;
&lt;li&gt;每想施加一个标签，它就调用&lt;code&gt;tag_span(&amp;quot;letter_001&amp;quot;, start, end, element_path, attrs)&lt;/code&gt;——在源文本的某个字符区间上登记一个TEI元素。&lt;/li&gt;
&lt;li&gt;完事后，它调用&lt;code&gt;compose(&amp;quot;letter_001&amp;quot;)&lt;/code&gt;。服务器把登记的标签与原始纯文本交织起来，渲染出最终的TEI，再&lt;em&gt;逐字节&lt;/em&gt;核验：渲染文档的扁平文本内容必须与源文本相等。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;字节相符，文档就返回。若不相符——哪怕模型的标签只是隐含了一个与源文本差一个字符的正文——&lt;code&gt;compose()&lt;/code&gt;便抛出异常，绝不返回一份已经走样的文档。&lt;/p&gt;
&lt;p&gt;在这条工作流里，不存在任何一条路径能让模型产出正文与源文本不同的TEI文档。这个不变量是机械的，不是行为的。您不必信任模型不会幻觉，只需信任两个字节串之间的一次&lt;code&gt;==&lt;/code&gt;比较。&lt;/p&gt;
&lt;h2 id="它是什么不是什么"&gt;它是什么，不是什么&lt;/h2&gt;
&lt;p&gt;区间锁定合成是对模式锚定的&lt;strong&gt;补充&lt;/strong&gt;，不是替代。模式锚定工具（&lt;code&gt;validate_document&lt;/code&gt;、&lt;code&gt;lookup_element&lt;/code&gt;、&lt;code&gt;valid_children&lt;/code&gt;，以及最初十六个工具中的其余部分）帮模型产出&lt;em&gt;有效&lt;/em&gt;的TEI；区间锁定合成则保证TEI里的正文&lt;em&gt;忠于&lt;/em&gt;源文本。一条可以投入使用的编码工作流必须同时满足这两个维度，如今两者由同一个服务器一并覆盖。&lt;/p&gt;
&lt;p&gt;它也不是包治百病的灵丹。&lt;code&gt;compose()&lt;/code&gt;还不会检查登记的标签是否为已加载的ODD定制所允许——这是后续工作。登记的标签存在进程内存里，重启即失。源文件也必须能从服务器运行的地方读到。这些都有办法解决，没有一项动摇核心不变量。&lt;/p&gt;
&lt;h2 id="为什么意义不止于tei"&gt;为什么意义不止于TEI&lt;/h2&gt;
&lt;p&gt;这个模式可以推而广之。凡是让模型去注释、转换或包裹一段文本，而底层文本的完整性又比模型“改进”它的本事更要紧，同样形态的解法都适用：别让模型重打一遍文本；让它在文本之上生成指令，再由一个确定性的合成器在相等性不变量的约束下执行。&lt;/p&gt;
&lt;p&gt;具体到数字版本，这改变了您可以放心交给模型去做的事。编码忽然成了一项可以委托的任务，不必再手动把每份输出与源文本逐一比对。机器走枯燥的那条路；校勘者审的是标记，不是拼写。&lt;/p&gt;
&lt;h2 id="获取更新"&gt;获取更新&lt;/h2&gt;
&lt;p&gt;已经装了tei-mcp的话：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uvx tei-mcp@latest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;或者全新安装：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install tei-mcp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;要使用区间锁定合成，请把服务器指向存放源纯文本文件的目录：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;TEI_MCP_SPAN_SOURCE_ROOT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/path/to/sources
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uvx tei-mcp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;每个文件的主名即为其文档ID（&lt;code&gt;letter_001.txt&lt;/code&gt; →
&lt;code&gt;letter_001&lt;/code&gt;）。&lt;/p&gt;
&lt;p&gt;源代码、完整文档以及该不变量的设计说明：
&lt;/p&gt;</description></item><item><title>另一种数字版本</title><link>https://clementgodbarge.com/zh/post/cavriana-edition/</link><pubDate>Tue, 24 Mar 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/zh/post/cavriana-edition/</guid><description>&lt;p&gt;大多数原始史料从未出版。我们赖以补救的模式——靠经费资助的数字版本——太贵、太集中、太脆弱，根本无法推广。我刚发表了
，说明我为什么要换一种方式来做Cavriana书信的校勘本：数字化的原始史料有机生长，基础设施降到最低，维护自动进行，向协作开放，而且便宜到连经费都用不着申请。这是在为一种数字人文辩护：无论有没有机构撑腰，它都能运转。&lt;/p&gt;</description></item><item><title>tei-mcp</title><link>https://clementgodbarge.com/zh/code/tei-mcp/</link><pubDate>Sun, 15 Mar 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/zh/code/tei-mcp/</guid><description>&lt;h2 id="tei-mcp给ai智能体用的tei-p5"&gt;tei-mcp：给AI智能体用的TEI P5&lt;/h2&gt;
&lt;p&gt;tei-mcp是一个开源
服务器，让AI编程助手直接访问
规范。AI不必再倚赖记忆中的训练数据——那往往产出貌似合理、实则错误的标记——而可以实时查询规范。&lt;/p&gt;
&lt;h2 id="功能"&gt;功能&lt;/h2&gt;
&lt;p&gt;服务器解析TEI P5的ODD，提供16个工具：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;按名称&lt;strong&gt;查询&lt;/strong&gt;任何元素、类、宏或模块，不区分大小写，拼错了还会给出建议&lt;/li&gt;
&lt;li&gt;沿完整的TEI类层次&lt;strong&gt;解析属性&lt;/strong&gt;（本地＋继承）&lt;/li&gt;
&lt;li&gt;把&lt;strong&gt;内容模型展开&lt;/strong&gt;成结构化的树，并解析类与宏&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;验证嵌套&lt;/strong&gt;——直接的父子关系，或带路径追踪的递归可达性&lt;/li&gt;
&lt;li&gt;依据TEI P5&lt;strong&gt;验证文档&lt;/strong&gt;：内容模型、属性、封闭取值列表、引用完整性、弃用警告&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;验证单个元素&lt;/strong&gt;，适用于增量编辑的工作流&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;加载ODD定制&lt;/strong&gt;，把模式约束到项目特定的子集&lt;/li&gt;
&lt;li&gt;用正则表达式在所有实体类型中&lt;strong&gt;搜索&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="安装"&gt;安装&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install tei-mcp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;或直接运行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uvx tei-mcp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="用法"&gt;用法&lt;/h2&gt;
&lt;p&gt;加入任何兼容MCP的客户端（Claude、Cursor、Windsurf等）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;mcpServers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;tei&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;uvx&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;args&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;tei-mcp&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;源代码与文档见
。&lt;/p&gt;</description></item><item><title>tei-mcp：给AI智能体用的TEI P5</title><link>https://clementgodbarge.com/zh/post/tei-mcp/</link><pubDate>Sun, 15 Mar 2026 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/zh/post/tei-mcp/</guid><description>&lt;p&gt;如果您用AI编程助手写过TEI XML，大概已经领教过它的错误：元素放错地方，属性凭空捏造，嵌套规则视若无睹。模型对TEI长什么样有个大概印象，对规范本身却没有可靠的知识。&lt;/p&gt;
&lt;p&gt;tei-mcp的解法，是让AI智能体通过工具直接访问TEI P5指南。&lt;/p&gt;
&lt;details class="print:hidden xl:hidden" &gt;
&lt;summary&gt;目录&lt;/summary&gt;
&lt;div class="text-sm"&gt;
&lt;nav id="TableOfContents"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#mcp是什么"&gt;MCP是什么？&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#tei-mcp做什么"&gt;tei-mcp做什么&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#为什么要紧"&gt;为什么要紧&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#上手"&gt;上手&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/nav&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id="mcp是什么"&gt;MCP是什么？&lt;/h2&gt;
&lt;p&gt;
（Model Context Protocol，MCP）是一项开放标准，让AI应用能接上外部数据源和工具。不妨把它看作AI的USB接口：一套协议，任何兼容的客户端——Claude、Cursor、Windsurf等等——都能借此接入专门的服务。&lt;/p&gt;
&lt;p&gt;MCP服务器对外提供&lt;em&gt;工具&lt;/em&gt;，AI在对话中可以随时调用。模型不必再靠记忆里的训练数据，而可以查询一个实时的、权威的来源。&lt;/p&gt;
&lt;h2 id="tei-mcp做什么"&gt;tei-mcp做什么&lt;/h2&gt;
&lt;p&gt;tei-mcp解析TEI P5的ODD规范，提供16个工具，涵盖校勘者或编码者最常问的问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;这个元素是什么？&lt;/strong&gt; 按名称查询任何元素、类、宏或模块，不区分大小写，拼错了还会给出建议。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;它能带哪些属性？&lt;/strong&gt; 沿完整的类层次解析属性——先列本地属性，再依次列出继承的属性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;它里面能放什么？&lt;/strong&gt; 把内容模型展开成结构化的树，或列出有效子元素的平面清单。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;这个元素能放在这儿吗？&lt;/strong&gt; 检查父子嵌套关系，或在完整的元素层次中追踪可达性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;我的文档有效吗？&lt;/strong&gt; 依据规范验证TEI XML文件：内容模型、属性值、封闭取值列表、引用完整性、弃用警告。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;我的项目模式呢？&lt;/strong&gt; 加载ODD定制文件，把上述一切约束到您项目特定的TEI子集。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="为什么要紧"&gt;为什么要紧&lt;/h2&gt;
&lt;p&gt;TEI编码离不开时时翻查指南。老手把最常见的模式记在心里，可遇到生僻元素或复杂的内容模型，照样得查规范。AI助手没有这种内化的知识，问题更严重：它们会幻觉出看似合理、实则错误的标记。&lt;/p&gt;
&lt;p&gt;有了tei-mcp，AI就不必猜了。写下第一个尖括号之前，它可以先去规范里查答案。结果便是符合TEI P5——或符合您项目ODD定制——的标记。&lt;/p&gt;
&lt;h2 id="上手"&gt;上手&lt;/h2&gt;
&lt;p&gt;从PyPI安装：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install tei-mcp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后加入您MCP客户端的配置：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;mcpServers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;tei&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;uvx&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;args&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;tei-mcp&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;服务器首次运行时下载TEI规范，可配合任何兼容MCP的客户端使用。&lt;/p&gt;
&lt;p&gt;源代码与完整文档：
&lt;/p&gt;</description></item><item><title>Multi-Saxon</title><link>https://clementgodbarge.com/zh/code/multi-saxon/</link><pubDate>Fri, 28 Mar 2025 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/zh/code/multi-saxon/</guid><description>&lt;h2 id="multi-saxon大型tei语料库的并行xslt处理"&gt;Multi-Saxon：大型TEI语料库的并行XSLT处理&lt;/h2&gt;
&lt;p&gt;Multi-Saxon填补了XML处理工具的一处要害空白：LXML（一个流行的Python XML库）处理不了的XSLT 2.0和3.0转换，它能并行执行。它专为大型XML TEI文档集合而设计，凭高效的并行执行大幅缩短处理时间。&lt;/p&gt;
&lt;h2 id="主要特性"&gt;主要特性&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;高级XSLT支持&lt;/strong&gt;：处理LXML力所不及的XSLT 2.0和3.0转换&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;并行处理&lt;/strong&gt;：借并行化大幅缩短大型文档集合的转换时间&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;为TEI优化&lt;/strong&gt;：专为文本编码倡议（TEI）XML文档打造&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;性能可扩展&lt;/strong&gt;：从数百到数千份文档的语料库，均可高效处理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;跨平台&lt;/strong&gt;：可在不同操作系统和环境下运行&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="multi-saxon解决什么问题"&gt;Multi-Saxon解决什么问题&lt;/h2&gt;
&lt;p&gt;使用TEI的数字人文学者常常面临两大难题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;LXML（常用的Python XML处理库）只支持XSLT 1.0，XSLT 2.0/3.0的高级特性无从使用&lt;/li&gt;
&lt;li&gt;大型TEI语料库若逐份顺序处理，耗时可能长到令人却步&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Multi-Saxon一举解决这两个问题：借用Saxon的高级XSLT能力，同时把处理分摊到多个核心，性能因此大增。&lt;/p&gt;
&lt;h2 id="实现"&gt;实现&lt;/h2&gt;
&lt;p&gt;Multi-Saxon把Python与Java的Saxon处理器结合起来，构成一条高性能的转换流水线：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用Java的Saxon库稳健地处理XSLT 2.0/3.0&lt;/li&gt;
&lt;li&gt;以多进程把转换分摊到可用的CPU核心&lt;/li&gt;
&lt;li&gt;高效管理处理器池，以求吞吐量最大化&lt;/li&gt;
&lt;li&gt;为批量处理TEI文档提供简洁的接口&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="用法示例"&gt;用法示例&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;multi_saxon&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;MultiSaxon&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Initialize with your XSLT stylesheet&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;transformer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MultiSaxon&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;transform.xsl&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Transform a single document&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;transformer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;input.xml&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;output.xml&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Transform an entire directory in parallel&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;transformer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transform_directory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;input_dir&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;output_dir&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="对数字人文的意义"&gt;对数字人文的意义&lt;/h2&gt;
&lt;p&gt;对处理大型TEI文档集合的数字人文项目，Multi-Saxon让以下成为可能：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;LXML无法完成的复杂全语料库转换&lt;/li&gt;
&lt;li&gt;大幅缩短处理时间（多核系统上常可提速5至10倍）&lt;/li&gt;
&lt;li&gt;借助XSLT 2.0/3.0的高级特性做更精细的分析&lt;/li&gt;
&lt;li&gt;简化整个文档集合的处理流程&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;源代码与文档见
。&lt;/p&gt;</description></item><item><title>persNamer</title><link>https://clementgodbarge.com/zh/code/persnamer/</link><pubDate>Fri, 28 Mar 2025 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/zh/code/persnamer/</guid><description>&lt;h2 id="persnamer把tei接上虚拟国际规范文档"&gt;persNamer：把TEI接上虚拟国际规范文档&lt;/h2&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;persNamer是一个专门的Python工具，简化把VIAF（虚拟国际规范文档，Virtual International Authority File）中的规范人物数据整合进TEI XML文档的流程。它把VIAF标识符转成可直接使用的TEI标记，为数字学术版本创建结构化人物条目的手工劳动因此大减。&lt;/p&gt;
&lt;h2 id="tei中规范控制的难处"&gt;TEI中规范控制的难处&lt;/h2&gt;
&lt;p&gt;数字学术版本往往需要精确识别历史人物，包括规范化的姓名和生卒年月。要在整个项目里保持一致的规范控制，需要：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;识别历史文本中的人物&lt;/li&gt;
&lt;li&gt;查找他们的规范数据&lt;/li&gt;
&lt;li&gt;创建格式正确的TEI条目&lt;/li&gt;
&lt;li&gt;确保全项目引用一致&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这些步骤通常靠手工，费时，还容易前后不一。&lt;/p&gt;
&lt;h2 id="persnamer如何工作"&gt;persNamer如何工作&lt;/h2&gt;
&lt;p&gt;persNamer把这套流程自动化：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;获取VIAF数据&lt;/strong&gt;：给定一个VIAF标识符，工具通过HTTP内容协商取回RDF数据&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;提取关键信息&lt;/strong&gt;：解析RDF，提取首选姓名、出生日期和死亡日期&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;生成TEI标记&lt;/strong&gt;：创建两段基本的XML片段：
&lt;ul&gt;
&lt;li&gt;一条&lt;strong&gt;规范文档条目&lt;/strong&gt;（&lt;code&gt;&amp;lt;person&amp;gt;&lt;/code&gt;元素，带生成的&lt;code&gt;xml:id&lt;/code&gt;、&lt;code&gt;&amp;lt;persName&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;lt;birth&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;lt;death&amp;gt;&lt;/code&gt;和&lt;code&gt;&amp;lt;idno type=&amp;quot;VIAF&amp;quot;&amp;gt;&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;一个独立的&lt;strong&gt;标注标签&lt;/strong&gt;（&lt;code&gt;&amp;lt;persName&amp;gt;&lt;/code&gt;，其&lt;code&gt;ref&lt;/code&gt;属性指向规范条目）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这样双管齐下，校勘者既能维护一份集中的规范文档，又能把标注标签轻松插入TEI文本。&lt;/p&gt;
&lt;h2 id="主要特性"&gt;主要特性&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;标准化ID生成&lt;/strong&gt;：按&lt;code&gt;pers-[familyname]-[givenname initial]&lt;/code&gt;格式生成一致的XML ID（如&lt;code&gt;pers-deteligny-c&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RDF解析&lt;/strong&gt;：用&lt;code&gt;rdflib&lt;/code&gt;从各种RDF属性（如&lt;code&gt;rdfs:label&lt;/code&gt;、&lt;code&gt;schema:name&lt;/code&gt;、&lt;code&gt;viaf:mainHead&lt;/code&gt;）中提取信息&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;命令行界面&lt;/strong&gt;：只需一个VIAF编号作为必要参数即可运行&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;详细输出&lt;/strong&gt;：除最终XML外，还提供详细的处理信息&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="用法示例"&gt;用法示例&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;python persNamer.py &lt;span class="m"&gt;314802260&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这条命令生成：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;person&lt;/span&gt; &lt;span class="na"&gt;xml:id=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;pers-deteligny-c&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;persName&amp;gt;&lt;/span&gt;Charles deTéligny&lt;span class="nt"&gt;&amp;lt;/persName&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;birth&amp;gt;&lt;/span&gt;1535&lt;span class="nt"&gt;&amp;lt;/birth&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;death&amp;gt;&lt;/span&gt;1572-08-24&lt;span class="nt"&gt;&amp;lt;/death&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;idno&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;VIAF&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;314802260&lt;span class="nt"&gt;&amp;lt;/idno&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/person&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;persName&lt;/span&gt; &lt;span class="na"&gt;ref=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;#pers-deteligny-c&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Charles deTéligny&lt;span class="nt"&gt;&amp;lt;/persName&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="在数字人文中的应用"&gt;在数字人文中的应用&lt;/h2&gt;
&lt;p&gt;persNamer对以下情形尤其有用：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;需要规范控制的数字学术版本&lt;/li&gt;
&lt;li&gt;涉及历史人物的TEI编码项目&lt;/li&gt;
&lt;li&gt;把文献与规范记录相连的关联数据项目&lt;/li&gt;
&lt;li&gt;保证大型TEI语料库的一致性&lt;/li&gt;
&lt;li&gt;在数字人文课程中讲授规范控制概念&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="实现"&gt;实现&lt;/h2&gt;
&lt;p&gt;persNamer用Python实现，依赖：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;requests&lt;/code&gt;：HTTP请求&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rdflib&lt;/code&gt;：RDF解析&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lxml&lt;/code&gt;：XML处理&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;源代码与文档见
。&lt;/p&gt;</description></item><item><title>用预训练语言模型大规模解析书目</title><link>https://clementgodbarge.com/zh/post/bibliography/</link><pubDate>Thu, 07 Jul 2022 19:04:14 +0200</pubDate><guid>https://clementgodbarge.com/zh/post/bibliography/</guid><description>&lt;p&gt;自动化是压低数字人文项目成本的关键。时至今日，学术圈里与校勘相关的重复、枯燥的工作，要么由不堪重负的学者高价完成，要么“外包”给学生。在这个
中，我主张：这些吃力不讨好的活儿，大多不仅&lt;em&gt;可以&lt;/em&gt;而且&lt;em&gt;应该&lt;/em&gt;自动化。校勘任务自动化，能降低数字人文项目的整体成本；更要紧的是，它让低收入地区的学者也能又快又省地出版有价值的文献。&lt;/p&gt;
&lt;p&gt;
里，我举例说明了预训练语言模型如何承担数字版本中大部分XML标注工作。&lt;/p&gt;
&lt;p&gt;这一篇讲第二个例子，这次说的是参考书目。&lt;/p&gt;
&lt;h2 id="问题"&gt;问题&lt;/h2&gt;
&lt;p&gt;从一篇学术文章提到的参考文献建一个书目数据库，本不算难事：到
这样的目录里快速查一下，按特定格式下载，或者从本地数据库自动导入。一两篇文章，这么做没问题。
可参考文献一多，这件事就变得又烦又耗时。补救办法是用
之类的解析算法，但这些算法很难放大规模。
我用anystyle转换我们
所收的150多篇学术论文时，累积的错误多到根本收拾不了。它认不出我们的许多文献来源，比如把近代早期书籍的长标题当成别的东西；也认不出不那么典型的文献，如特定网页、在线视频等等。解析器管用的前提是作者一丝不苟地遵守芝加哥、Turabian或MLA之类的通行规范；稍有出格，便出错。&lt;/p&gt;
&lt;h2 id="解决方案"&gt;解决方案&lt;/h2&gt;
&lt;p&gt;这正是
&lt;mark&gt;预训练语言模型&lt;/mark&gt;
的用武之地：它们能
&lt;mark&gt;迅速看懂任何书目格式的规律&lt;/mark&gt;
——哪怕是您自创的格式——只需几个示例，就能把大量已排版的参考书目正确转成
。&lt;/p&gt;
&lt;p&gt;2021年初，我有幸提前用上了OpenAI的
。Codex是一个在自然语言与代码之间互译的模型。据OpenAI称，它精通十几种编程语言；写这篇博文时，它的API还处于测试阶段，却已在为GitHub的
等热门应用提供支持。&lt;/p&gt;
&lt;p&gt;摆弄了一阵这个API，我发现它对&lt;code&gt;BibTeX&lt;/code&gt;这样更简单的代码也同样得心应手。&lt;/p&gt;
&lt;p&gt;事实上，输入提示词里只放四个示例，它就能稳定地工作。&lt;/p&gt;
&lt;h3 id="输入提示词"&gt;输入提示词&lt;/h3&gt;
&lt;p&gt;References:
Bayle, Ariane. “Patients exemplaires: la correspondance médicale de Fioravanti.” In &lt;em&gt;Vulgariser la médecine. Du style médical en France et en Italie&lt;/em&gt;, edited by Andrea Carlino and Michel Jeanneret, 181–212. Geneva: Droz, 2009.&lt;/p&gt;
&lt;p&gt;Berns, Andrew D. &lt;em&gt;The Bible and Natural Philosophy in Renaissance Italy: Jewish and Christian Physicians in Search of Truth&lt;/em&gt;. Cambridge: Cambridge University Press, 2015.&lt;/p&gt;
&lt;p&gt;Gabler, Hans Walter. “Theorizing the Digital Scholarly Edition.” &lt;em&gt;Literature Compass&lt;/em&gt; 7, no. 2 (2010): 43–56.
.&lt;/p&gt;
&lt;p&gt;Findlen, Paula. &lt;em&gt;Possessing Nature: Museums, Collecting, and Scientific Culture in Early Modern Italy&lt;/em&gt;. Berkeley: University of California Press, 1994.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-BibTeX" data-lang="BibTeX"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nc"&gt;@incollection&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;bayle2009&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;author&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Bayle, Ariane}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;booktitle&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Vulgariser la médecine. Du style médical en France et en Italie}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;title&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Patients exemplaires: la correspondance médicale de Fioravanti}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;editor&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Carlino, Andrea and Michel Jeanneret}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;year&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{2009}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;address&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Geneva}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;publisher&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Droz}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;langid&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{french}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nc"&gt;@book&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;berns2015&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;title&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{The Bible and Natural Philosophy in Renaissance Italy: Jewish and Christian Physicians in Search of Truth}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;author&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Berns, Andrew D.}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;address&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Cambridge}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;publisher&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Cambridge University Press}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;langid&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{english}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;date&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{2015}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nc"&gt;@article&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;gabler2010&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;author&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Gabler, Hans Walter}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;title&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Theorizing the Digital Scholarly Edition}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;journal&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Literature Compass}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;volume&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{7}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;number&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{2}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;pages&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{43-56}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;doi&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{10.1111/j.1741-4113.2009.00675.x}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;langid&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{english}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;year&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{2010}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nc"&gt;@book&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;findlen1994&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;title&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Possessing Nature: Museums, Collecting, and Scientific Culture in Early Modern Italy}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;author&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Findlen, Paula}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;address&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Berkeley}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;publisher&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{University of California Press}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;langid&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{english}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;date&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{1994}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="结果"&gt;结果&lt;/h3&gt;
&lt;p&gt;
&lt;mark&gt;令人瞩目：两千多条参考文献，几天之内便转换完毕。&lt;/mark&gt;
这个方法不仅准确复现了我在提示词中展示的模式，还正确地添加了提示词里没有的条目类型和字段类型。换言之，&lt;code&gt;GPT-3&lt;/code&gt;说得一口流利的&lt;code&gt;BibTeX&lt;/code&gt;。对一个基本靠英语训练的模型来说，更叫人惊讶的或许是：它认出了所有语言（俄语、法语、意大利语、拉丁语、希腊语、德语、西班牙语等），每次都加上了正确的&lt;code&gt;langid&lt;/code&gt;字段。&lt;/p&gt;
&lt;div class="callout flex px-4 py-3 mb-6 rounded-md border-l-4 bg-blue-100 dark:bg-blue-900 border-blue-500"
data-callout="note"
data-callout-metadata=""&gt;
&lt;span class="callout-icon pr-3 pt-1 text-blue-600 dark:text-blue-300"&gt;
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="m16.862 4.487l1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8l.8-2.685a4.5 4.5 0 0 1 1.13-1.897zm0 0L19.5 7.125"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;div class="callout-content dark:text-neutral-300"&gt;
&lt;div class="callout-title font-semibold mb-1"&gt;注意&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;GPT-3目前的输入输出规模有限，最多只能处理2048个语言词元（token）。这一限制一旦解除，同样的任务大概只需一小时，甚至更短。&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;有些出乎意料的是，GPT-3还添加了原始参考文献里没有的信息。&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;Baillot, Anne, and Anna Busch. “Editing for Man and Machine.” In &lt;em&gt;Users of Scholarly Editions: Editorial Anticipations of Reading, Studying and Consulting&lt;/em&gt;, Vol. 13. Variants (Journal of the European Society for Textual Scholarship). Leicester, 2015.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;比如在这条参考文献里，GPT-3加上了可以阅读该论文的开放获取仓储（
）的永久链接，连HAL仓储自创的专用字段&lt;code&gt;HAL_ID&lt;/code&gt;和&lt;code&gt;HAL_VERSION&lt;/code&gt;也一并加上：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-BibTeX" data-lang="BibTeX"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nc"&gt;@inproceedings&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;baillot2015&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;title&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Editing for Man and Machine}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;author&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Baillot, Anne and Busch, Anna}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;year&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;booktitle&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Users of Scholarly Editions: Editorial Anticipations of Reading, Studying and Consulting}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;address&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Leicester}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;series&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Variants (Journal of the European Society for Textual Scholarship)}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;volume&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;editor&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Bruhn, Siglinde and Schreiber, Manfred}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;langid&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{english}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;hal_id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{halshs-01233380}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;hal_version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{v1}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这些补充说明，
&lt;mark&gt;GPT-3不只是解析参考文献，还会根据它当初学到的东西把参考文献补全。&lt;/mark&gt;
就此而言，看看它对GPT-3训练之后才出现的文献是否也这般表现，会很有意思……&lt;/p&gt;
&lt;h2 id="局限"&gt;局限&lt;/h2&gt;
&lt;p&gt;不过GPT-3并不完美，得有人盯着。它的已知局限之一是
：有时会凭空捏造，做出一些不太靠谱的假设。&lt;/p&gt;
&lt;p&gt;在我的实验中，GPT-3的不连贯有一次表现得很明显：它擅自把一位作者的姓氏从“Ruscelli”改成了“Ruscello”。严格说这不算错，因为近代早期意大利姓氏的单复数可以混用。可如今的惯例是，姓氏原本是单数还是复数，就照原样保留。今天没有人会把Machiavelli叫成Machiavello，正如我们该写Rossello而不是Rosselli。GPT-3无视这条惯例，是因为缺少年代意识？还是因为它根据邻近的姓氏做了推断——书目这一段的姓氏碰巧都是单数（Bariletto、Cesano、Rossello）？
谁知道呢。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-Bibtex" data-lang="Bibtex"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nc"&gt;@book&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;rossello1565&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;title&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Della summa de’ secreti universali}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;author&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Rossello, Timoteo}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;address&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Venice}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;publisher&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Giovanni Bariletto}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;langid&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{italian}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;date&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{1565}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nc"&gt;@book&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;ruscello1559&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;title&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{La seconda parte de’ secreti del Reverendo Donno Alessio Piemontese}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;author&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Ruscello, Girolamo}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;address&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Pesaro}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;publisher&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{Bartolomeo Cesano}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;langid&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{italian}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;date&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;{1559}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="结论"&gt;结论&lt;/h2&gt;
&lt;p&gt;
150多篇论文，是四年密集合作的结晶；它们不仅提供了有关我们所编辑、翻译的手稿的关键信息，还蕴含着宝贵的书目信息。&lt;/p&gt;
&lt;p&gt;把这些参考文献汇入一个数据库，校勘者便能转眼之间更换书目格式，想怎么呈现就怎么呈现。这个数据库还提供了关于该版本及其背后项目的宝贵信息，为学者打开了新的分析视角。而这样的数据库，可以在创纪录的时间内以极高的准确率建成。&lt;/p&gt;
&lt;p&gt;诚然，会有一些错误混进来，尤其是因为GPT-3爱产生幻觉。但预训练语言模型的后续版本将会缓解这个问题。&lt;/p&gt;</description></item><item><title>Avviso | 出版让我们走向现代的新闻（1537—1743）</title><link>https://clementgodbarge.com/zh/project/map/</link><pubDate>Sun, 12 Dec 2021 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/zh/project/map/</guid><description>&lt;p&gt;&lt;em&gt;Avviso&lt;/em&gt;项目的主要目标，是对35000份近代早期手抄新闻信（即&lt;em&gt;avvisi&lt;/em&gt;）进行数字化、保存、编目、校勘、语境化和传播；这些新闻信原属美第奇家族收藏，现藏于佛罗伦萨国家档案馆。
借助美第奇档案计划的Medici Interactive Archive平台，对约35000份&lt;em&gt;avvisi&lt;/em&gt;（近代早期手抄新闻信）进行编目、数字化与传播。&lt;/p&gt;</description></item><item><title>高效校勘</title><link>https://clementgodbarge.com/zh/project/dce/</link><pubDate>Sun, 12 Dec 2021 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/zh/project/dce/</guid><description>&lt;p&gt;数字校勘本代价高昂。转录、翻译、注释，须由高素质人员完成，动辄数千小时；除了长期的机构支持，还需要大笔经费。&lt;/p&gt;
&lt;p&gt;数字人文领域那些引人注目的项目能拿到运作所需的巨额经费，从某种意义上说是一种福气。&lt;/p&gt;
&lt;p&gt;可是，过度倚赖富有基金会、大学和政府机构的慷慨，长年需要大量人力，终究不是一种能面向未来的经济模式。就算越来越多的学者做得起雄心勃勃的原始史料数字版本，这种做法依然是少数富裕国家的特权，反倒强化了它们的文化霸权。&lt;/p&gt;
&lt;p&gt;要让世界各地的历史文献走向更广大的公众，
&lt;mark&gt;数字校勘本的成本就得降低几个数量级&lt;/mark&gt;
。&lt;/p&gt;
&lt;p&gt;在这一组博文里，我评估世界各地学者可以用来更快、更省地出版原始史料的各种办法和技术模块。&lt;/p&gt;
&lt;p&gt;我将着重评估机器学习、区块链和去中心化存储等技术。&lt;/p&gt;</description></item><item><title>数字学术版本的标记自动化</title><link>https://clementgodbarge.com/zh/post/gpt3/</link><pubDate>Mon, 22 Nov 2021 18:15:00 +0000</pubDate><guid>https://clementgodbarge.com/zh/post/gpt3/</guid><description>&lt;h1 id="引言"&gt;引言&lt;/h1&gt;
&lt;p&gt;如何做数字学术版本而不至于倾家荡产？本文是“高效校勘”系列的第一篇；我在这里评估预训练语言模型在编辑任务自动化——譬如语义标记——中能扮演什么角色。&lt;/p&gt;
&lt;details class="print:hidden xl:hidden" &gt;
&lt;summary&gt;目录&lt;/summary&gt;
&lt;div class="text-sm"&gt;
&lt;nav id="TableOfContents"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#爱的劳作"&gt;爱的劳作&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#高门槛"&gt;高门槛&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#transformer通往自动化的最短路径"&gt;Transformer：通往自动化的最短路径？&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#codex"&gt;Codex&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#openai之外"&gt;OpenAI之外&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#实验1文本分类"&gt;实验1——文本分类&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#提示词工程"&gt;提示词工程&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#测试"&gt;测试&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#结果"&gt;结果&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#实验2语义标记"&gt;实验2——语义标记&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#提示词工程-1"&gt;提示词工程&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#测试-1"&gt;测试&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/nav&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h1 id="问题"&gt;问题&lt;/h1&gt;
&lt;h2 id="爱的劳作"&gt;爱的劳作&lt;/h2&gt;
&lt;p&gt;情之所钟，不计代价……俗话是这么说的。数字学术版本尤其如此：转录、翻译、注释，动辄数千小时的工作，而且——
（《文艺复兴时期法国的工艺与自然之秘》）便是一例——要靠数百位高素质的合作者来完成。&lt;/p&gt;
&lt;p&gt;数字人文领域那些引人注目的项目能拿到运作所需的巨额经费，从某种意义上说是一种福气。可是，过度倚赖富有基金会、大学和政府机构的慷慨，长年需要大量人力，终究不是一种能面向未来的经济模式。&lt;/p&gt;
&lt;p&gt;说到底，如果我们希望世界各地的学者都能把历史文献带到更广大的公众面前，
&lt;mark&gt;数字校勘本的成本就得降低几个数量级&lt;/mark&gt;
。&lt;/p&gt;
&lt;h2 id="高门槛"&gt;高门槛&lt;/h2&gt;
&lt;p&gt;有点吊诡的是，
&lt;mark&gt;出路也许正来自
这类劳动密集的项目：它们本身就是宝贵的训练集&lt;/mark&gt;
，可以用来把数字校勘中最叫人厌烦、最重复的活儿——比如标记——交给机器。&lt;/p&gt;
&lt;p&gt;这不是说标记无关紧要。恰恰相反，
&lt;mark&gt;标记已经成为任何严肃的数字学术项目都少不了的组成部分。&lt;/mark&gt;
经
标准化之后，它让我们得以记录文献及其所承载文本的方方面面：结构、页边批注、删改、异文、纸张种类、污渍、字体……凡你能想到的，都能记下来。&lt;/p&gt;
&lt;p&gt;下面这个例子取自
，展示了标记如何给文本附加信息（类别、结构、语义场、删改等等），最终使数字版本比起纸本前身有了显著的优势。&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt; 纯文本 &lt;/th&gt;
&lt;th&gt; XML标记&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Pour rompre grenades et donner
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;violence aux artifices de foeu
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Mects parmy la pouldre et la sixiesme
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;partye dicelle de vif argent
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
&lt;td&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;p008r_2&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;categories=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;arms and armor&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;Pour rompre &lt;span class="nt"&gt;&amp;lt;wp&amp;gt;&lt;/span&gt;grenades&lt;span class="nt"&gt;&amp;lt;/wp&amp;gt;&lt;/span&gt; et donner&lt;span class="nt"&gt;&amp;lt;lb/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;violence aux &lt;span class="nt"&gt;&amp;lt;wp&amp;gt;&lt;/span&gt;artifices de foeu&lt;span class="nt"&gt;&amp;lt;/wp&amp;gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;ab&amp;gt;&lt;/span&gt;Mects parmy la &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;pouldre&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;del&amp;gt;&amp;lt;ms&amp;gt;&lt;/span&gt;six fois autant&lt;span class="nt"&gt;&amp;lt;/ms&amp;gt;&lt;/span&gt; de
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;vif argent&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&amp;lt;/del&amp;gt;&amp;lt;lb/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;del&amp;gt;&lt;/span&gt;et&lt;span class="nt"&gt;&amp;lt;/del&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;&amp;lt;ms&amp;gt;&lt;/span&gt;la sixiesme partye&lt;span class="nt"&gt;&amp;lt;/ms&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; dicelle de &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;vif argent&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&amp;lt;/ab&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;这些信息不仅有存档价值，而且——我此前已多次展示——对综合与分析同样有用。不过，这类注释极其耗时，因为同一段文本往往要以多种面貌出现：译文、转录、现代化拼写本，等等。&lt;/p&gt;
&lt;h1 id="解决方案"&gt;解决方案&lt;/h1&gt;
&lt;h2 id="transformer通往自动化的最短路径"&gt;Transformer：通往自动化的最短路径？&lt;/h2&gt;
&lt;p&gt;2020年，
大张旗鼓地推出了新一代通用大规模语言模型GPT-3，全称“Generative Pre-trained Transformer 3”（生成式预训练Transformer第三代）。Transformer是人工智能领域相当新近的突破：学新任务快得惊人，只需读一段提示词、看寥寥几个例子。也可以用专门的数据集再训练一番（微调），以改善延迟与准确率。正因如此，GPT-3和同类Transformer被称为
。&lt;/p&gt;
&lt;p&gt;据OpenAI称，GPT-3拥有创纪录的1750亿参数，训练文本超过570GB，其中大部分是英文文档，想必取自
。凭着这份体量，GPT-3为该领域立下了新标杆：开箱即用，便能完成各式各样的任务，逼真得叫人不安。它能写像模像样的
，能在聊天室里
，能
、
、翻译文档、解释行话，不一而足。&lt;/p&gt;
&lt;p&gt;自2021年5月起，我提前拿到了OpenAI的API使用权，得以试验这个模型解决若干公认难题的本事：把法语诗歌和新拉丁语文本译成英语，解释类比，甚至把康德《道德形而上学奠基》第四卷讲给七岁小孩听（虽说讲得不怎么令人信服）。&lt;/p&gt;
&lt;h3 id="codex"&gt;Codex&lt;/h3&gt;
&lt;p&gt;GPT-3最近的一项进展专攻计算机语言。这个名为&lt;em&gt;Codex&lt;/em&gt;的模型能在自然语言与计算机语言之间互译。比方说，我想要一个正则表达式，用来“只查找以大写字母开头的单词”，GPT-3立刻把这句话译成一条可用的正则表达式：&lt;code&gt;[A-Z]+\w+&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;据OpenAI称，&lt;em&gt;Codex&lt;/em&gt;能处理十几种计算机语言，包括Python、JavaScript、Go、Perl、PHP、Ruby和Swift。它把伪代码顺畅地转成代码，人们便不必再为计算机语言繁琐的语法费神，可以专心于让应用程序解决问题的逻辑步骤与策略。&lt;/p&gt;
&lt;h3 id="openai之外"&gt;OpenAI之外&lt;/h3&gt;
&lt;p&gt;当然，OpenAI并非独一家。前面提过，北京智源人工智能研究院2021年宣布了一个更大、更强的模型，名为&lt;em&gt;悟道2.0&lt;/em&gt;（&lt;em&gt;Wu Dao 2&lt;/em&gt;）。Nvidia与微软联手推出了名副其实的&lt;em&gt;Megatron-Turing NLG 530B&lt;/em&gt;。
和
这样的小型初创公司也向公众提供API。
等开源项目同样值得一提。人工智能这个圈子变化极快；要追踪新动向，不妨看看
。&lt;/p&gt;
&lt;h1 id="实验"&gt;实验&lt;/h1&gt;
&lt;div class="callout flex px-4 py-3 mb-6 rounded-md border-l-4 bg-blue-100 dark:bg-blue-900 border-blue-500"
data-callout="note"
data-callout-metadata=""&gt;
&lt;span class="callout-icon pr-3 pt-1 text-blue-600 dark:text-blue-300"&gt;
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="m16.862 4.487l1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8l.8-2.685a4.5 4.5 0 0 1 1.13-1.897zm0 0L19.5 7.125"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;div class="callout-content dark:text-neutral-300"&gt;
&lt;div class="callout-title font-semibold mb-1"&gt;注意&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;这些实验的目的，是找到一条通往编辑任务可靠自动化的最经济的路。有人会说，其中一些任务用监督学习算法也能自动化。这个假设留待以后的文章探讨。&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;像GPT-3这样的Transformer，能不能学会给一份十六世纪的技术与科学手稿加注释？&lt;/p&gt;
&lt;h2 id="实验1文本分类"&gt;实验1——文本分类&lt;/h2&gt;
&lt;p&gt;先从相对简单的开始。既然是“少样本学习者”，GPT-3理应能很快摸清我们编辑团队给Ms Fr 640各条目分类的路数。&lt;/p&gt;
&lt;h3 id="提示词工程"&gt;提示词工程&lt;/h3&gt;
&lt;p&gt;训练时，我只用了一段极简的提示词，另选四个简短的纯文本条目作示例，其中有关于“医学”“武器与盔甲”和“绘画”的条目。&lt;/p&gt;
&lt;h3 id="测试"&gt;测试&lt;/h3&gt;
&lt;p&gt;然后，我另抄了一段不在初始序列里的文字：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Working neatly
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Never put down, if you can, two colors one on top of the other.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;But next, having made your design carefully, keep the place of shadows for them alone,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;amp; also separately that of lights &amp;amp; highlights, without layering one color all over &amp;amp; then highlighting or else shading on it.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;And in this way, you further your work, economize your colors &amp;amp; work neatly.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Which is the reason that, the colors not being muddled nor mixed together, they do not die &amp;amp; you soften the colors better, since they are not so thick.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;输出与内容完全吻合：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;categories&lt;/span&gt;&lt;span class="err"&gt;=&amp;#34;painting&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;再试一个条目，其类别压根不在最初选来训练GPT-3的文本之列，结果令人吃惊。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;categories&lt;/span&gt;&lt;span class="err"&gt;=&amp;#34;jewelry&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="结果"&gt;结果&lt;/h3&gt;
&lt;p&gt;我们的Ms. Fr. 640版本里并没有“jewelry”（珠宝）这个类别；编辑团队
用更宽泛的“Stones”（石料）。不过GPT-3的直觉不错，这说明只要再多训练一点，它就能学会给Ms. Fr. 640的任何条目分类，或许连类似的十六世纪技术文本也不在话下。&lt;/p&gt;
&lt;h2 id="实验2语义标记"&gt;实验2——语义标记&lt;/h2&gt;
&lt;p&gt;把门槛再抬高一些。既然GPT-3这样的Transformer能按特定的编辑标准给文本分类，它们能不能也识别出文本中的部分标记？&lt;/p&gt;
&lt;div class="callout flex px-4 py-3 mb-6 rounded-md border-l-4 bg-blue-100 dark:bg-blue-900 border-blue-500"
data-callout="note"
data-callout-metadata=""&gt;
&lt;span class="callout-icon pr-3 pt-1 text-blue-600 dark:text-blue-300"&gt;
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="m16.862 4.487l1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8l.8-2.685a4.5 4.5 0 0 1 1.13-1.897zm0 0L19.5 7.125"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;div class="callout-content dark:text-neutral-300"&gt;
&lt;div class="callout-title font-semibold mb-1"&gt;注意&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;&lt;em&gt;Secrets of Craft and Nature&lt;/em&gt;采用语义标签与结构标签的
。可惜，与
等项目不同，GPT-3不处理图像。GPT日后的版本很可能会补上这项能力——识别文献的大多数结构和物质特征都离不开它。这些标签我们暂且跳过，只看不需要图像识别的标记。&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="提示词工程-1"&gt;提示词工程&lt;/h3&gt;
&lt;p&gt;语义标签涉及动物、植物、地名、感官信息等等。训练提示词里，我从版本中挑了几个例子：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!--Input prompt--&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;The following is a list of words and their corresponding semantic tags
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cannons: &lt;span class="nt"&gt;&amp;lt;wp&amp;gt;&lt;/span&gt;cannons&lt;span class="nt"&gt;&amp;lt;/wp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;powder: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;powder&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;flasks: &lt;span class="nt"&gt;&amp;lt;tl&amp;gt;&lt;/span&gt;flasks&lt;span class="nt"&gt;&amp;lt;/tl&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wooden: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;wooden&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;iron: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;iron&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;parchment: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;parchment&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;goats: &lt;span class="nt"&gt;&amp;lt;al&amp;gt;&lt;/span&gt;goats&lt;span class="nt"&gt;&amp;lt;/al&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lambs: &lt;span class="nt"&gt;&amp;lt;al&amp;gt;&lt;/span&gt;lambs&lt;span class="nt"&gt;&amp;lt;/al&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;leather: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;leather&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;earth: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;earth&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fine fatty earth: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;fine fatty earth&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Venice: &lt;span class="nt"&gt;&amp;lt;pl&amp;gt;&lt;/span&gt;Venice&lt;span class="nt"&gt;&amp;lt;/pl&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Flemish: &lt;span class="nt"&gt;&amp;lt;pl&amp;gt;&lt;/span&gt;Flemish&lt;span class="nt"&gt;&amp;lt;/pl&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;almond: &lt;span class="nt"&gt;&amp;lt;pa&amp;gt;&lt;/span&gt;almond&lt;span class="nt"&gt;&amp;lt;/pa&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;almond oil: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&amp;lt;pa&amp;gt;&lt;/span&gt;almond&lt;span class="nt"&gt;&amp;lt;/pa&amp;gt;&lt;/span&gt; oil&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;walnuts skin: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&amp;lt;pa&amp;gt;&lt;/span&gt;walnuts&lt;span class="nt"&gt;&amp;lt;/pa&amp;gt;&lt;/span&gt; skin&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;molten lead: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;molten lead&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;today: &lt;span class="nt"&gt;&amp;lt;tmp&amp;gt;&lt;/span&gt;today&lt;span class="nt"&gt;&amp;lt;/tmp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;In the past: &lt;span class="nt"&gt;&amp;lt;tmp&amp;gt;&lt;/span&gt;In the past&lt;span class="nt"&gt;&amp;lt;/tmp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Clockmakers: &lt;span class="nt"&gt;&amp;lt;pro&amp;gt;&lt;/span&gt;Clockmakers&lt;span class="nt"&gt;&amp;lt;/pro&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;red copper: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;red copper&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;crucible: &lt;span class="nt"&gt;&amp;lt;tl&amp;gt;&lt;/span&gt;crucible&lt;span class="nt"&gt;&amp;lt;/tl&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bellows: &lt;span class="nt"&gt;&amp;lt;tl&amp;gt;&lt;/span&gt;bellows&lt;span class="nt"&gt;&amp;lt;/tl&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;charcoal: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;charcoal&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;founders: &lt;span class="nt"&gt;&amp;lt;pro&amp;gt;&lt;/span&gt;founders&lt;span class="nt"&gt;&amp;lt;/pro&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="测试-1"&gt;测试&lt;/h3&gt;
&lt;p&gt;先用&lt;code&gt;Davinci-codex&lt;/code&gt;模型试几个容易的词：&lt;em&gt;Apothecary&lt;/em&gt;（药剂师）、&lt;em&gt;smoke&lt;/em&gt;（烟）、&lt;em&gt;glassmakers&lt;/em&gt;（玻璃匠）、&lt;em&gt;latten&lt;/em&gt;（黄铜合金）、&lt;em&gt;snake&lt;/em&gt;（蛇）。结果立等可取，毫无差错：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!--Output--&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Apothecary: &lt;span class="nt"&gt;&amp;lt;pro&amp;gt;&lt;/span&gt;Apothecary&lt;span class="nt"&gt;&amp;lt;/pro&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;smoke: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;smoke&lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;glassmakers: &lt;span class="nt"&gt;&amp;lt;pro&amp;gt;&lt;/span&gt;glassmakers&lt;span class="nt"&gt;&amp;lt;/pro&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;latten: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;latten&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;snake: &lt;span class="nt"&gt;&amp;lt;al&amp;gt;&lt;/span&gt;snake&lt;span class="nt"&gt;&amp;lt;/al&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;更难的一关是复合词，如&lt;em&gt;copper plates&lt;/em&gt;（铜板）、&lt;em&gt;walnut oil&lt;/em&gt;（核桃油）、&lt;em&gt;wood block&lt;/em&gt;（木块）。这一关考的是GPT-3能否正确处理嵌套标签。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!--Output--&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;copper plates: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;copper plates&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;walnut oil: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&amp;lt;pa&amp;gt;&lt;/span&gt;walnut&lt;span class="nt"&gt;&amp;lt;/pa&amp;gt;&lt;/span&gt; oil&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wood block: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&lt;/span&gt;wood block&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;结果好坏参半：&lt;code&gt;Davinci-codex&lt;/code&gt;只标对了&lt;em&gt;walnut oil&lt;/em&gt;，没能识别出&lt;em&gt;copper plates&lt;/em&gt;和&lt;em&gt;wood block&lt;/em&gt;里的&lt;code&gt;tl&lt;/code&gt;与&lt;code&gt;m&lt;/code&gt;嵌套标签。不过，下面的测试表明，这类错误可以靠更好的训练提示词来补救。再加上五个嵌套标签的例子之后，&lt;code&gt;Davinci-codex&lt;/code&gt;交出了近乎完美的答卷，只错了一处（&lt;em&gt;oil paintbrushes&lt;/em&gt;）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!--Output--&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cannon powder: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&amp;lt;wp&amp;gt;&lt;/span&gt;cannon&lt;span class="nt"&gt;&amp;lt;/wp&amp;gt;&lt;/span&gt; powder&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;arquebus powder: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&amp;lt;wp&amp;gt;&lt;/span&gt;arquebus&lt;span class="nt"&gt;&amp;lt;/wp&amp;gt;&lt;/span&gt; powder&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;oil paintbrushes: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&amp;lt;al&amp;gt;&lt;/span&gt;oil&lt;span class="nt"&gt;&amp;lt;/al&amp;gt;&lt;/span&gt; paintbrushes&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sheep footbones: &lt;span class="nt"&gt;&amp;lt;m&amp;gt;&amp;lt;al&amp;gt;&lt;/span&gt;sheep&lt;span class="nt"&gt;&amp;lt;/al&amp;gt;&lt;/span&gt; footbones&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bronze mortar: &lt;span class="nt"&gt;&amp;lt;tl&amp;gt;&amp;lt;m&amp;gt;&lt;/span&gt;bronze&lt;span class="nt"&gt;&amp;lt;/m&amp;gt;&lt;/span&gt; mortar&lt;span class="nt"&gt;&amp;lt;/tl&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="结论"&gt;结论&lt;/h1&gt;
&lt;p&gt;须记住，这些测试用的都是很小的文本片段。我猜想，若在示例和提示词里提供更多上下文，GPT-3模型的表现还会更好。再用专门的训练数据集微调一番，标注的准确率无疑会更上一层楼。&lt;br&gt;
这些实验固然还需扩大规模，才能证明预训练语言模型的可靠性；但我们已经可以下结论：
&lt;mark&gt;这种方法让校勘者只需几个简单的步骤，就能把多项注释任务交给机器，从而可能省下大量的时间和金钱。&lt;/mark&gt;
&lt;/p&gt;</description></item><item><title>手稿可视化2（更新）</title><link>https://clementgodbarge.com/zh/post/treemap2/</link><pubDate>Sat, 20 Nov 2021 16:00:00 +0000</pubDate><guid>https://clementgodbarge.com/zh/post/treemap2/</guid><description>&lt;p&gt;如约而至：
介绍的交互式树状图出了新版本，这回有两种查看模式。&lt;/p&gt;
&lt;div class="callout flex px-4 py-3 mb-6 rounded-md border-l-4 bg-blue-100 dark:bg-blue-900 border-blue-500"
data-callout="note"
data-callout-metadata=""&gt;
&lt;span class="callout-icon pr-3 pt-1 text-blue-600 dark:text-blue-300"&gt;
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="m16.862 4.487l1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8l.8-2.685a4.5 4.5 0 0 1 1.13-1.897zm0 0L19.5 7.125"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;div class="callout-content dark:text-neutral-300"&gt;
&lt;div class="callout-title font-semibold mb-1"&gt;注意&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;为获得更佳的浏览效果，请确保网页设置为浅色模式（点击右上角的月亮图标）。&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;head&gt;
&lt;meta charset="UTF-8" /&gt;
&lt;meta http-equiv="X-UA-Compatible" content="IE=edge" /&gt;
&lt;meta name="viewport" content="width=device-width, initial-scale=1.0" /&gt;
&lt;title&gt;&lt;/title&gt;
&lt;link rel="preconnect" href="https://fonts.gstatic.com" /&gt;
&lt;link
href="https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;700&amp;display=swap"
rel="stylesheet"
/&gt;
&lt;link rel="stylesheet" href="css/index.css" /&gt;
&lt;link rel="stylesheet" href="css/vis-treemap.css" /&gt;
&lt;link rel="stylesheet" href="css/vis-tooltip.css" /&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div class="stacked"&gt;
&lt;div class="switch"&gt;
&lt;input
type="checkbox"
name="group-by-category-switch"
id="group-by-category-switch"
checked
/&gt;
&lt;label for="group-by-category-switch"&gt; Group folios by category &lt;/label&gt;
&lt;/div&gt;
&lt;div id="treemap"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;script src="https://cdn.jsdelivr.net/npm/d3@7.9.0/dist/d3.min.js" integrity="sha384-CjloA8y00+1SDAUkjs099PVfnY2KmDC2BZnws9kh8D/lX1s46w6EPhpXdqMfjK6i" crossorigin="anonymous" referrerpolicy="no-referrer"&gt;&lt;/script&gt;
&lt;script src="js/vis-treemap.js"&gt;&lt;/script&gt;
&lt;script src="js/vis-tooltip.js"&gt;&lt;/script&gt;
&lt;script src="js/index.js"&gt;&lt;/script&gt;
&lt;/body&gt;</description></item><item><title>档案的可视化浏览器</title><link>https://clementgodbarge.com/zh/post/treemap/</link><pubDate>Sun, 20 Jun 2021 16:00:00 +0000</pubDate><guid>https://clementgodbarge.com/zh/post/treemap/</guid><description>&lt;h1 id="问题"&gt;问题&lt;/h1&gt;
&lt;p&gt;数字版本身上有个悖论：它们让艰深的文献走向更广大的公众，可去物质化带来的感官信息的流失，又往往让读者摸不着头脑，甚至打消了深入其内容的念头。在庞大的文献库里穿行，于是变得相当繁琐，令人却步。不只是缺乏档案研究经验的用户如此，有认知障碍的读者也是如此。&lt;/p&gt;
&lt;h1 id="解决方案"&gt;解决方案&lt;/h1&gt;
&lt;p&gt;这正是档案元数据能帮上忙的地方。的确，这类数据让我们能做出交互式的视觉抽象，为读者提供另一种感官输入，从而既提升易用性，也提升可及性。要让档案在视觉上可以穿行，树状图（treemap），或任何能有效分解层级数据的图表，都能派上用场。&lt;/p&gt;
&lt;h1 id="实验"&gt;实验&lt;/h1&gt;
&lt;p&gt;我的第一个实验改编了&lt;code&gt;D3.js&lt;/code&gt;的
，并加上超链接。它呈现的是BnF Ms Fr 640手稿、其各对开页，以及每一对开页内的条目。颜色代表主导类别。鼠标悬停在条目上可以看到更多数据，包括指向手稿的超链接。&lt;br&gt;
这样一来，树状图便成了一个交互式的视觉索引，让读者一眼扫过，便对手稿内容——以及每一对开页、每一条目的篇幅——有个快速而灵敏的概览。&lt;br&gt;
&lt;del&gt;接下来几个月，我会继续试验这个想法，尝试别的图表和别的层级……敬请期待！&lt;/del&gt; 树状图的新版本请点击
。&lt;/p&gt;
&lt;div class="callout flex px-4 py-3 mb-6 rounded-md border-l-4 bg-blue-100 dark:bg-blue-900 border-blue-500"
data-callout="note"
data-callout-metadata=""&gt;
&lt;span class="callout-icon pr-3 pt-1 text-blue-600 dark:text-blue-300"&gt;
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="m16.862 4.487l1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8l.8-2.685a4.5 4.5 0 0 1 1.13-1.897zm0 0L19.5 7.125"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;div class="callout-content dark:text-neutral-300"&gt;
&lt;div class="callout-title font-semibold mb-1"&gt;注意&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;为获得更佳的浏览效果，请确保网页设置为浅色模式（点击右上角的月亮图标）。&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;head&gt;
&lt;meta charset="UTF-8" /&gt;
&lt;meta http-equiv="X-UA-Compatible" content="IE=edge" /&gt;
&lt;meta name="viewport" content="width=device-width, initial-scale=1.0" /&gt;
&lt;title&gt;&lt;/title&gt;
&lt;link rel="preconnect" href="https://fonts.gstatic.com" /&gt;
&lt;link
href="https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;700&amp;display=swap"
rel="stylesheet" /&gt;
&lt;link rel="stylesheet" href="css/index.css" /&gt;
&lt;link rel="stylesheet" href="css/vis-treemap.css" /&gt;
&lt;link rel="stylesheet" href="css/vis-tooltip.css" /&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;p&gt;Click any cell to zoom in, or the top to zoom out.&lt;/p&gt;
&lt;div id="treemap"&gt;&lt;/div&gt;
&lt;script src="https://cdn.jsdelivr.net/npm/d3@7.9.0/dist/d3.min.js" integrity="sha384-CjloA8y00+1SDAUkjs099PVfnY2KmDC2BZnws9kh8D/lX1s46w6EPhpXdqMfjK6i" crossorigin="anonymous" referrerpolicy="no-referrer"&gt;&lt;/script&gt;
&lt;script src="js/vis-treemap.js"&gt;&lt;/script&gt;
&lt;script src="js/vis-tooltip.js"&gt;&lt;/script&gt;
&lt;script src="js/index.js"&gt;&lt;/script&gt;
&lt;/body&gt;</description></item><item><title>档案一览</title><link>https://clementgodbarge.com/zh/post/dashboard/</link><pubDate>Mon, 24 May 2021 16:00:00 +0000</pubDate><guid>https://clementgodbarge.com/zh/post/dashboard/</guid><description>&lt;h1 id="问题"&gt;问题&lt;/h1&gt;
&lt;p&gt;历史档案的杂乱可以叫人望而生畏。
的&lt;em&gt;Mediceo del Principato&lt;/em&gt;全宗就是个典型：编有目录的只是一小部分，许多文献不知何故散落在6500多卷之中。更麻烦的是，档案馆每次只让你调阅有限数量的卷（他们称之为&lt;em&gt;filze&lt;/em&gt;）。平时限额是每天4卷&lt;em&gt;filze&lt;/em&gt;；到了疫情期间，降到每两周4卷。没有详细目录，档案又如此庞大，研究者只好自己想办法，好尽快找到要找的文献。&lt;/p&gt;
&lt;h1 id="解决方案"&gt;解决方案&lt;/h1&gt;
&lt;p&gt;有人靠运气，也有人会根据年代、收信人、作者、全宗来源、语言等等，做出有根据的猜测。然而，把这些变量同时&lt;em&gt;看&lt;/em&gt;在眼里，或许能揭示档案结构中意想不到的规律，让我们猜得更准。依我的经验，研究者平常记在电子表格里的元数据，一旦画成图，就能大大提高在档案馆里的态势感知。&lt;/p&gt;
&lt;h1 id="实验"&gt;实验&lt;/h1&gt;
&lt;p&gt;我目前的研究围绕一位十六世纪间谍的书信。他的信散布在数百卷&lt;em&gt;filze&lt;/em&gt;里：以不同的身份写成，寄给不同的、有时出人意料的收信人，发自不同的地点，如此等等。为了找出更可能藏有目标信件的&lt;em&gt;filze&lt;/em&gt;，我搭了一个仪表盘——一个交互式数据可视化网页应用（
），把各类数据（包括地理和年代信息）与全宗的层级图（
）连在一起。仪表盘让我一眼看出已经找到了什么、占多大比例，并大致知道还可以到哪里去找新信。点击某个变量，所有图表还会随之更新，显示特定的关联。&lt;/p&gt;
&lt;h1 id="下一步"&gt;下一步&lt;/h1&gt;
&lt;p&gt;也许更要紧的是，这个仪表盘可以改作视觉索引。等这些书信的校勘本上线，仪表盘将成为另一个入口，读者可以从这里浏览数据。出于保密考虑，眼下我只能展示一张打了码的截图，完整的仪表盘明年发布。在此之前，很快会先放出一个原型。敬请期待！&lt;/p&gt;</description></item><item><title>Making &amp; Knowing Project</title><link>https://clementgodbarge.com/zh/project/mk/</link><pubDate>Sun, 27 Dec 2020 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/zh/project/mk/</guid><description>&lt;p&gt;
由Pamela H. Smith创立于2014年，有数百位合作者参与，是哥伦比亚大学
的一项研究与教学计划。&lt;/p&gt;
&lt;p&gt;我以博士后研究员的身份参与该项目，工作之一是BnF Ms. Fr. 640的
。这份独一无二的十六世纪法文手稿，让我们得以第一手地窥见一个艺术家即科学家的时代如何制作、如何用料。&lt;/p&gt;
&lt;p&gt;该数字版本在
上免费提供了大量数据。来年我打算写一组博文，谈这个版本及其数据，展示用Python或R下载、分析文本何等容易。敬请期待！&lt;/p&gt;</description></item><item><title>BnF Ms. Fr. 640语义标记的可视化</title><link>https://clementgodbarge.com/zh/post/visualization/</link><pubDate>Sun, 20 Dec 2020 18:15:00 +0000</pubDate><guid>https://clementgodbarge.com/zh/post/visualization/</guid><description>&lt;h1 id="概述"&gt;概述&lt;/h1&gt;
&lt;p&gt;数据丰富的学术版本里藏着宝贵的编辑注释，可以提取、分析、可视化，服务于各种学术目的。2020年发布的
（《文艺复兴时期法国的工艺与自然之秘》）便是如此：它的元数据文件可从GitHub仓库下载。本文展示如何把这些变量汇成一个相关矩阵，再以不同方式画出来。&lt;/p&gt;
&lt;h1 id="数据"&gt;数据&lt;/h1&gt;
&lt;p&gt;Making and Knowing Project生成了一份电子表格，载有手稿内容的最新信息：&lt;code&gt;entry_metadata.csv&lt;/code&gt;。该文件可从Making &amp;amp; Knowing的
取得。另外，也可以借助Matthew Kumar出色的
——BnF Ms. Fr. 640的Python版本——生成定制的.csv文件，加入更多标记。&lt;/p&gt;
&lt;h2 id="设置python"&gt;设置Python&lt;/h2&gt;
&lt;p&gt;数据整理用Pandas，热图用Matplotlib和seaborn，最后用NetworkX生成基于相关的网络。&lt;br&gt;
对这类变量，我们避开Pearson法，改用𝜙𝐾法。请务必先
这种相关方法及其对应的库&lt;code&gt;PhiK&lt;/code&gt;。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#install packages&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;phik&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# import modules&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;pd&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;matplotlib.pyplot&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;plt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;seaborn&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;sns&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;networkx&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;nx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="准备数据"&gt;准备数据&lt;/h2&gt;
&lt;p&gt;首先，从该版本
的metadata文件夹下载最新的元数据文件。
我们只选需要的列。本演示中，我选了英文译文&lt;code&gt;tl&lt;/code&gt;里的全部语义标签；您也可以选法文转录&lt;code&gt;tc&lt;/code&gt;或规范化版本&lt;code&gt;tcn&lt;/code&gt;里的标签。
数据是分号分隔的值，得让Python替我们数。于是用stack-unstack方法，配合正则表达式&lt;code&gt;[^;\s][^\;]*[^;\s]*&lt;/code&gt;来数。
为了让矩阵更好读，我们把每一列重新命名。赶时间的话，这一步可以跳过，只需记住此时的数据框叫&lt;code&gt;tagsrn&lt;/code&gt;。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# load the edition&amp;#39;s metadata&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;entry_metadata.csv&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# select the tags you want to correlate&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;dftags&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;al_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;bp_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;cn_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;df_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;env_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;m_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;md_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;ms_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;mu_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;pa_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;pl_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;pn_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;pro_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;sn_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;tl_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;tmp_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;wp_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;de_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;el_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;it_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;la_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;oc_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;po_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# count comma separated values&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;tagcount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dftags&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dropna&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;[^;\s][^\;]*[^;\s]*&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;unstack&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# rename columns&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;tagsrn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tagcount&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rename&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;columns&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;al_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;animals&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;bp_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;body parts&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;cn_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;currency&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;df_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;definitions&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;env_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;environment&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;m_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;material&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;md_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;medical&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;ms_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;measurement&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;mu_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;music&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;pa_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;plant&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;pl_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;toponym&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;pn_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;person&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;pro_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;profession&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;sn_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;sensory&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;tl_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;tool&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;tmp_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;temporal&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;wp_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;weapons&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;de_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;German&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;el_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Greek&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;it_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Italian&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;la_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Italian&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;oc_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Occitan&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;po_tl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Poitevin&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="计算相关"&gt;计算相关&lt;/h1&gt;
&lt;p&gt;数据框清理干净，就可以计算各变量之间的相关系数了。这一步要紧的是吃透您的数据，确保用的是最合适的相关方法。&lt;code&gt;pandas-profiling&lt;/code&gt;包对此特别有帮助。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# calculate correlation coefficient with the phi k method&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;cortag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tagsrn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;phik_matrix&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;cortag&lt;/code&gt;就是我们的相关矩阵。现在可以试试不同类型的可视化了。&lt;/p&gt;
&lt;h1 id="可视化"&gt;可视化&lt;/h1&gt;
&lt;p&gt;首先可以试的，是用&lt;code&gt;seaborn&lt;/code&gt;的
把它画成一个颜色编码的矩阵。&lt;/p&gt;
&lt;h3 id="相关热图"&gt;相关热图&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subplots&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;figsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sns&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;heatmap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cortag&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;linewidths&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;.03&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vmin&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cmap&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Oranges&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;square&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="BnF Ms. Fr. 640的相关热图"
srcset="https://clementgodbarge.com/post/visualization/heatmap_hu_943abdd98e24b0a3.webp 320w, https://clementgodbarge.com/post/visualization/heatmap_hu_eca41311a0e0ac17.webp 480w, https://clementgodbarge.com/post/visualization/heatmap_hu_1650defb643c0285.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://clementgodbarge.com/post/visualization/heatmap_hu_943abdd98e24b0a3.webp"
width="760"
height="665"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;熟悉这份文本的人，一眼就能看出这张热图很有道理。譬如，人名与拉丁语强相关，因为把人名拉丁化是当时的风气，尤以十六世纪的人文主义者为甚。&lt;/p&gt;
&lt;p&gt;有人会说，这张热图不过是在陈述显而易见的事。他们不全错；乍看之下，医学标签正是一例——它与身体部位、计量和植物相关，本在意料之中。&lt;/p&gt;
&lt;p&gt;但要是逐行细读热图，或许会发现一些有趣而意外的相关。例如，医学标签与意大利语、拉丁语词汇相关，这就为Ms. Fr. 640中医学配方的来源提供了线索。同样，职业、定义与计量三者之间的相关，显示出职业身份在多大程度上构造了十六世纪的技术话语。&lt;/p&gt;
&lt;h3 id="相关聚类图"&gt;相关聚类图&lt;/h3&gt;
&lt;p&gt;热图适合“探索”阶段，可在听众眼里未免有些凌乱，尤其当您正在讨论——或仍在寻找——手稿中特定的语义簇时。Seaborn的&lt;code&gt;clustermap&lt;/code&gt;模块也许能给出有趣的结果。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;clustermap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sns&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clustermap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cortag&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;figsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;dendrogram_ratio&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;.2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;vmin&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cmap&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Oranges&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cbar_pos&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;.06&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;.12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;.03&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;.68&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="BnF Ms. Fr. 640的相关聚类图"
srcset="https://clementgodbarge.com/post/visualization/clustermap_hu_677e6e5028f9d902.webp 320w, https://clementgodbarge.com/post/visualization/clustermap_hu_2dac945fa40a8ac6.webp 480w, https://clementgodbarge.com/post/visualization/clustermap_hu_3abaf7b36a53572.webp 753w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://clementgodbarge.com/post/visualization/clustermap_hu_677e6e5028f9d902.webp"
width="753"
height="760"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;聚类图看起来像一只像素化的（没错，这个词已收入《牛津英语词典》）昆虫；除此之外，它清楚地把孤立的标签（顶部和左侧）与联系更紧密的标签分了开来。我们还能分辨出孤立的簇，如音乐和普瓦图方言（谁能想到！），以及更为核心的簇，如计量、材料、定义和武器。职业的联系更广，但至少在这个相关矩阵里，它不属于哪个特定的簇。&lt;/p&gt;
&lt;h3 id="相关网络"&gt;相关网络&lt;/h3&gt;
&lt;p&gt;若想把矩阵里的相关进一步提炼，网络图是个优雅的办法，尤其适合向人介绍手稿内容的场合。&lt;br&gt;
为此，我们要把矩阵转成边和节点的列表，并定一个阈值，把较弱的相关从图中剔除。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# transform the data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;links&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cortag&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reset_index&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;links&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;columns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;var1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;var2&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;value&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# threshold &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;links_filtered&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;links&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="n"&gt;links&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;value&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;.6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;links&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;var1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;links&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;var2&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;links_filtered&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# create edges&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;G&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;from_pandas_edgelist&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;links_filtered&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;var1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;var2&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# draw network using Kamada &amp;amp; Kawai&amp;#39;s algorithm &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;figsize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;nx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;draw_kamada_kawai&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;G&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;with_labels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;node_color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;red&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;node_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;edge_color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;black&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;linewidths&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;font_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="BnF Ms. Fr. 640的相关图"
srcset="https://clementgodbarge.com/post/visualization/graph_hu_396032c00cb7f7f3.webp 320w, https://clementgodbarge.com/post/visualization/graph_hu_85295e5fba6293bc.webp 480w, https://clementgodbarge.com/post/visualization/graph_hu_4190dbca7e86ffc1.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://clementgodbarge.com/post/visualization/graph_hu_396032c00cb7f7f3.webp"
width="760"
height="760"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;边和节点太多的话，可以调整阈值，让结果更清爽。要不然，也可以用&lt;code&gt;.write_gexf()&lt;/code&gt;函数把图导出，到&lt;code&gt;Gephi&lt;/code&gt;里把玩。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;nx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write_gexf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;G&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;graph.gexf&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;结果见本文开头。&lt;/p&gt;
&lt;h3 id="更新环形加权网络"&gt;更新：环形加权网络&lt;/h3&gt;
&lt;p&gt;我一直在找把相关矩阵显示为加权网络的办法，找到了
这个有趣的思路，在此改编到我们的数据集上。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# create graph weighted by correlation coefficients (unfiltered)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Gx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;from_pandas_edgelist&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;links&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;var1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;var2&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;edge_attr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;value&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# determine a threshold to remove some edges&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;threshold&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# list to store edges to remove&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;remove&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# loop through edges in Gx and find correlations which are below the threshold&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;var1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;var2&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;Gx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;edges&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;corr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Gx&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;var1&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;var2&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;value&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;#add to remove node list if abs(corr) &amp;lt; threshold&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;corr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;threshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;remove&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;var1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;var2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# remove edges contained in the remove list&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Gx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;remove_edges_from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39; edges removed&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;去掉几条边之后，就可以决定边的颜色和粗细了。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# determine the colors of edges&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;assign_colour&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;correlation&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;correlation&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mf"&gt;0.8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#ff872c&amp;#39;&lt;/span&gt; &lt;span class="c1"&gt;# orange&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#f11d28&amp;#39;&lt;/span&gt; &lt;span class="c1"&gt;# red&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;assign_thickness&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;correlation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;benchmark_thickness&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;scaling_factor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;benchmark_thickness&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nb"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;correlation&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;scaling_factor&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;assign_node_size&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;degree&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;scaling_factor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;degree&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;scaling_factor&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;我们还让节点的大小与其连接数成正比。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# assign node size depending on number of connections (degree)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;node_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Gx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;degree&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;node_size&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;assign_node_size&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;结果是一张加权图：容纳了更多节点和多得多的边，却依然清晰可读、信息丰富。&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="BnF Ms. Fr. 640的加权相关图"
srcset="https://clementgodbarge.com/post/visualization/weightedgraph_hu_7b75f2e5fc7edb1b.webp 320w, https://clementgodbarge.com/post/visualization/weightedgraph_hu_9f0550eb49c17f11.webp 480w, https://clementgodbarge.com/post/visualization/weightedgraph_hu_a9106989817361fb.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://clementgodbarge.com/post/visualization/weightedgraph_hu_7b75f2e5fc7edb1b.webp"
width="760"
height="760"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Filippo Cavriana的秘密通信，1568—1589</title><link>https://clementgodbarge.com/zh/project/cavrianas-correspondence/</link><pubDate>Fri, 27 Dec 2019 00:00:00 +0000</pubDate><guid>https://clementgodbarge.com/zh/project/cavrianas-correspondence/</guid><description>&lt;p&gt;Filippo Cavriana的秘密书信，是法国宗教战争独一无二的见证：二十余年间，法国宫廷内外由阴谋、战役、谈判与密谋所主宰的生活，尽在其中。&lt;/p&gt;
&lt;p&gt;这些信藏于
，大多散落在数百卷未编目的卷宗里——佛罗伦萨人管这叫&lt;em&gt;filze&lt;/em&gt;。过去几年，我发现了数十封新信，但这类档案研究正变得越来越难：远离佛罗伦萨，意大利某些公共服务的退化，再加上新冠疫情，都让这类出版项目成了一场漫长而没有把握的工程。&lt;/p&gt;
&lt;p&gt;困难虽与日俱增，出版原始史料仍应是历史学家分内之事。不过，这类出版物的形态或许该变一变了：原始史料的出版不仅要适应上述处境，还应更好地体现这类研究的渐进性质，同时让别人有可能接着做下去。&lt;/p&gt;
&lt;p&gt;由此便有了这个想法：开发一种新型的数字出版项目，要&lt;strong&gt;可扩展&lt;/strong&gt;、&lt;strong&gt;可持续&lt;/strong&gt;、&lt;strong&gt;可信&lt;/strong&gt;、&lt;strong&gt;不依赖平台&lt;/strong&gt;，并且有可能&lt;strong&gt;协作&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;版本现已上线：&lt;strong&gt;
&lt;/strong&gt;。它汇集了迄今转录的信件——来自佛罗伦萨、曼托瓦的国家档案馆以及法国国家图书馆（BnF）——并随着新信的浮现而不断增长。设计背后的思路，我在
里作了说明。&lt;/p&gt;</description></item></channel></rss>