中图法(CLC)简介及其分类号正则表达式

中图法(CLC,中国图书馆分类法)是国内各大公众/高校图书馆最广为采用的图书分类方法,分为A-Z中除去LMWY共22个一级目类,与研究型STEM院所较为密切相关的是N(自然科学总论)、O(数理科学和化学)、P(天文学、地球科学)、Q(生物科学)、T(工业技术)等一级目类。T类又下分A-U共21个二级目类,计算机科学相关的书籍大多入TP类。由此看出,其实该分类法与现代知识分类还是有所脱节的,更不必说兀立在B类以外的A类了。然而,中图法的确是我们无法离开的一套成熟的图书分类法。

中图法的助记符号系统还是比较完整的,包含了多种复分或组合助记符号。

比如《蜗牛科学超入门》系列的《数学超入门》分类号为O1-49,《物理学超入门》分类号为O4-49,O1即数学二级目类,而-49中的-符号代表此分类号参照《总论复分表》进行复分,-4为教育与普及复分以及目类,-49为普及读物复分二级目类。

有了总论复分,一定程度上可以帮助你判别一本书是否靠谱。比如,著名鸡汤伪科普《水知道答案》有堂堂正正的CIP在版分类号O742-49,O742是“晶体化学的规律性”三级目类,如果你觉得这个领域很有趣的话,请不要局限于带-49的书,去翻翻O74下不带49复分号的,例如由何涌、雷新荣写的《结晶化学》教材,你大概就能知道《水知道答案》基本就是在扯皮。换成《蜗牛科学超入门》,你会发现没有复分号的书在内容和思想上与其保持高度一致,那你就应该可以放心了。

除此之外还有地区复分,如分类号为F570.73(251)的《’95上海地铁年鉴》,其中的(251)就是地区复分号,而F570.73中的.符号则是因为目类层级较深,除了一级类目以外每三级都会加上的帮助人阅读的间隔号。需要注意的是,一般CIP在版数据都只会包含总论复分号,地区复分一般在图书馆方便分类时由图书馆馆员另行自主分类,也可不分。

组合助记符号能够让一本涉及多个领域的书被分入多个领域,比如《教育经济学年鉴》可入F08:G40-054。

还有高优先级助记符号a,不过是后缀的,紧跟在类目之后。至于干嘛的大家可以去搜一下。

不过也可以看出,中图法的助记符号系统还是比较乱的,包围符和间隔符混用且表意并未有太大差别,也没有对先后顺序做严格的规定。不过借助正则还是能够处理的,而且既没有空格也没严格的顺序规定,存储起来还是不太费空间的,就是有点麻烦。

下面用PHP代码的形式给出一种可能的正则表达式。其中,clc_simple能够处理没有组合助记符的分类信息,clc_abandoned_included能够处理含已停用分类号(但必须给出新分类号)的分类信息,而clc_complex。clc_class_v5_strict将T的二级类目限定在《中图法第五版》所规定的TA-TU之间。

/* 不含复分信息的正则表达式 */
// 粗略判断,允许非法的如M、TZ等大类目
$regex_clc_class = '[A-Z]{2}\d{0,3}';
// 仅允许第五版规定的大类目
$regex_clc_class_v5_strict = '([A-K]|[N-V]|X|Z)[A-U]?\d{0,3}';

/* 含复分信息的正则表达式 */
// 可以处理粗略的分类信息
$regex_clc_simple = '\[?'. $regex_clc_class .'(?:\/\d{1,3})?a?(?:[.|\-|=|+]\d{1,3}|\(\d{1,3}\)|"\d{1,3}"|<\d{1,3}>)*\]?';
// 可以处理形如 {停用分类号}<现用分类号> 的分类信息
$regex_clc_abandoned_included = '{?'.$regex_clc_simple.'(?:}<(?:'.$regex_clc_simple.')>)?';
// 可以处理含组合助记符的分类信息
$regex_clc_complete = $regex_clc_abandoned_included.'(?:[:+](?:'.$regex_clc_abandoned_included.'))*';

将上面的语句输出出来,我们可以得到粗略的正则表达式为

{?\[?[A-Z]{1,2}\d{0,3}(?:\/\d{1,3})?a?(?:[.|\-|=|+]\d{1,3}|\(\d{1,3}\)|"\d{1,3}"|<\d{1,3}>)*\]?(?:}<(?:\[?[A-Z]{1,2}\d{0,3}(?:\/\d{1,3})?a?(?:[.|\-|=|+]\d{1,3}|\(\d{1,3}\)|"\d{1,3}"|<\d{1,3}>)*\]?)>)?(?:[:+](?:{?\[?[A-Z]{1,2}\d{0,3}(?:\/\d{1,3})?a?(?:[.|\-|=|+]\d{1,3}|\(\d{1,3}\)|"\d{1,3}"|<\d{1,3}>)*\]?(?:}<(?:\[?[A-Z]{1,2}\d{0,3}(?:\/\d{1,3})?a?(?:[.|\-|=|+]\d{1,3}|\(\d{1,3}\)|"\d{1,3}"|<\d{1,3}>)*\]?)>)?))*

语义上进行判断的正则表达式为

{?\[?([A-K]|[N-V]|X|Z)[A-U]?\d{0,3}(?:\/\d{1,3})?a?(?:[.|\-|=|+]\d{1,3}|\(\d{1,3}\)|"\d{1,3}"|<\d{1,3}>)*\]?(?:}<(?:\[?([A-K]|[N-V]|X|Z)[A-U]?\d{0,3}(?:\/\d{1,3})?a?(?:[.|\-|=|+]\d{1,3}|\(\d{1,3}\)|"\d{1,3}"|<\d{1,3}>)*\]?)>)?(?:[:+](?:{?\[?([A-K]|[N-V]|X|Z)[A-U]?\d{0,3}(?:\/\d{1,3})?a?(?:[.|\-|=|+]\d{1,3}|\(\d{1,3}\)|"\d{1,3}"|<\d{1,3}>)*\]?(?:}<(?:\[?([A-K]|[N-V]|X|Z)[A-U]?\d{0,3}(?:\/\d{1,3})?a?(?:[.|\-|=|+]\d{1,3}|\(\d{1,3}\)|"\d{1,3}"|<\d{1,3}>)*\]?)>)?))*

测试样例如下(基本是虚构的分类号,但符合中图法标准)({TS956.2+1}不能被正确显示,于此另放)

A
O1-62
J523.2"17"+3:G5
TP312
K837.125.6(202)+R173:G25a
[X-019]
F08:G40-054
K876.3=49
G49a

需要注意的是,如果需要提取数据,还需去掉不少的(?:expression)中的?:和加上不少匹配对象的圆括号。由于本次自己开发的应用暂时用不到这些,所以就没有钻研了。