DigitalPlatform / dp2

Integrated Library System / 图书馆集成系统
http://digitalplatform.github.io/dp2
Apache License 2.0
105 stars 54 forks source link

著者号码生成问题 #214

Open homemigcn opened 5 years ago

homemigcn commented 5 years ago

你好,今天邮件联系过。 使用你们在线生成著者号系统的编目老师之前发现过若干问题,但没有详细的记录。我们已经约定好在以后的工作中发现并及时反馈问题。 目前发现的: 著者姓名为“陈嘉放”的,生成的著者号C461是错的,正确的应该是C451。我们同样测试了其它拼音为jia的汉字,生成都是C461。而同样的名字,姓氏改为其他姓氏如“李嘉放”就是正确的L181。

DigitalPlatform commented 5 years ago

@homemigcn 首先允许我表示非常非常地感谢!

我检查了程序代码,发现这里确实有个 bug,在匹配

        <r n='JA-JIA' v='C450' f='10' />
        <r n='JIAN-JIE' v='C460' f='10' />

的时候。应该是匹配 C450 的。

然后我觉得这一部分关键代码的质量有问题,我补充了一个单元测试,在这里: https://github.com/DigitalPlatform/dp2/blob/master/TestDp2Library/TestAuthorNumber.cs

现在取号 Service 已经更新了,请您再测试一下,希望我们改正了问题,也没有引入新的问题。


我有一个想法:您是否现在手头有一批以前已经取号的正确结果呢?就是一个著者字符串和一个著者号对应,有这样一批对照关系的数据。如果能提供给我,我可以制作一个测试工具,就能迅速发现(那些也许依然存在的)错误,确保这部分代码的质量了。

如果您不方便自己处理为对照表格式,但有现成的一批 MARC 数据里面有 7XX 字段和 905$e 这样的信息,如果方便的话,也可以考虑把这样的 MARC 文件提供给我们,我们可以处理为适合用于测试的形态。

另外,我们的单元测试部分代码,也希望征集到一些志愿者参与,帮助我们完善这部分单元测试。如果您感兴趣,我后面再继续介绍如何参与。

homemigcn commented 5 years ago

@DigitalPlatform 不客气,真正说感谢的应该是我们!作为编目工作中经常会用到的工具,在之前很长的时间里你提供的在线生成系统给我同事们的工作带来了极大的便利。 就在昨天我们还在讨论能否有这样的平台汇集一批索书号使用著者号的用户,共同完善这个系统。 我们也不能保证目前的馆藏数据里所有的著者号是完全正确的,一个原因是我们年初刚刚更换了管理系统,在数据迁移的过程中有些丢失了;另一个原因来自我们本身,编目工作中难免会有失误。 如果需要,我可以整理一下发给你。说不定在测试过程中还能帮我们发现其中我们自己都没有发现的错误,哈哈。

DigitalPlatform commented 5 years ago

@homemigcn

现在的 GitHub Issues 这里讨论应该是很方便的,可以起到汇集用户的作用。QQ 群比较原始一些,文字会流失,如果不去特意整理就留不下来,而这里不会有问题。

“我们也不能保证目前的馆藏数据里所有的著者号是完全正确的”,是的。如果我们用馆藏数据里面的对照关系来逐个对照 GCAT 软件取出来的号,当发现不一致的时候,肯定会引起我们的注意,我们一定能人工判断出,到底是数据本身不对,还是软件取号不对了。这样,既可以测试验证软件的正确性,也可以提高图书馆数据的质量,您说呢?不过,即便发现了著者号问题,图书上面的书脊标签也要看具体情况,不一定是能够撕掉重新制作的,但至少可以发现问题,帮助我们共同改进工作。

那么看您方便,什么时候把这些数据提供给我,我来做一个测试的模块。

homemigcn commented 5 years ago

以后就在 GitHub Issues 讨论吧,我明天要出差,我先导一个馆藏MARC数据。我手边没有提取指定字段数据的好工具,能推荐一两个不?

DigitalPlatform commented 5 years ago

@homemigcn dp2 系统的内务和编目前端,都可以用 MarcQuery 脚本提取字段信息。不过需要编写一点脚本程序,要会写 C# 程序才行。(这是假定索取号在 MARC 记录里面。但不一定是这样。很多系统索取号不在 MARC 记录里面,而是在册信息里面) 如果您的 MARC 数据没有保密问题,可以全部提供给我们,我们做测试的时候自然会只取其中的关键字段,忽略其他字段。如果有保密问题,您可以先过滤掉其他字段,只留下著者汉字形态和著者号信息提供给我们即可。

homemigcn commented 5 years ago

@DigitalPlatform 我们的MARC数据不存在保密问题,可以全提供你们。正在输出,需要些时间。

homemigcn commented 5 years ago

馆藏MARC已发。 编目老师今天又发现两个生成错误的著者号 戴京京,网上生成号码:D102;正确号码D112 程惠霞,网上生成号码:C737;正确号码C747

DigitalPlatform commented 5 years ago

今天有用户用 金曾豪 取号出现错误。已经解决。


贝德福徳 遇到报错。“贝”的 XML 定义如下:

<i h="贝" p="BEI4">
    <r n="E" v="B675" f="5" />
    <r n="K" v="B680" f="5" />
    <r n="Q" v="B685" f="5" />
    <r n="T" v="B690" f="5" />
    <r n="X" v="B695" f="5" />
    <r n="Z" v="B700" f="5" />
</i>

可以看出,DE 这个拼音在定义里面是找不到的。需要查查原书看看,这里的定义是否正确

homemigcn commented 5 years ago

钱宁,网上生成号码:Q212;正确号码Q222 学方团队,网上不能生成;正确号码为X976

DigitalPlatform commented 5 years ago

@homemigcn

戴京京 的号码 D102 我正在处理 戴京京 的查找过程如下:

著者字符串 '戴京京' 经去除非用字、将阿拉伯和罗马数字转换为汉字数字后,为 '戴京京'。
以字符串 '戴京京' 对著者号码库 '著者号码' 进行试探性检索,结果未命中。
以字符串 '戴京' 对著者号码库 '著者号码' 进行试探性检索,结果未命中。
以字符串 '戴' 对著者号码库 '著者号码' 进行试探性检索,结果命中 1 条。
获得记录路径 '著者号码/333' 。
把字符串 '戴京京' 切割为姓 '戴' 和名 '京京' 两部分。
取出著者号码表记录 '著者号码/333' 内容为:
---
<i h="戴" p="DAI4" dprms:path="net.pipe://localhost/dp2kernel?著者号码/333" dprms:timestamp="97f561959e28d308000000000000014c" xmlns:dprms="http://dp2003.com/dprms">
        <r n="F" v="D100" f="10" />
        <r n="L" v="D110" f="10" />
        <r n="S" v="D120" f="10" />
        <r n="X" v="D130" f="10" />
        <r n="Z" v="D140" f="10" />
    </i>
---
按照有'名'情况处理。
取出名中第一字符 '京',
获得其拼音为 'jing'。
对著者号码XML记录进行查找,查找的详细过程如下:
---
缺省的第一个范围的起始字母为 'A'。
范围字符串 'F' 
范围字符串被处理为 [F-L>
命中。但是继续向后探测。
范围字符串 'L' 
范围字符串被处理为 [L-S>
当前条目范围已偏向比测试值左方。但先前条目命中过。所以返回value='D100' fufen='10'
---
获得值为 'D100' 复分表类型为 '10'。
发现有复分表。
双名要取出名的第二字符 '京',
获得其拼音为 'jing'。
用名之第一音 'jing' 和 第二音 'jing' 查复分表 '10' 。
查找复分表的详细过程如下:
---
取名之第二字拼音 'jing'的首字母 'j'。
匹配 '10' 型双名复分表。
和 'A-E' 进行比对。
和 'F-G' 进行比对。
和 'H-J' 进行比对。
命中,获得增量为 '2' 。
---
获得增量值 2。
值字符串 'D100' 和 增量值 2 合成,得到最终著者号 'D102'。

从上面可以看出,这个版本对 XML 匹配的过程有错。本来 <r n="F" v="D100" f="10" /> 中的 F 应该是扩展为 A-F。即,F 表示末端,而不是前端。程序这里弄错了。已经改正过来了。

简言之,就是 GCAT 模块,在 XML 格式方面采用了一种简化的格式,把书上的范围 A-F 简化为 F 了。后面会专门介绍这些情况。

DigitalPlatform commented 5 years ago

从 MARC 记录中提取著者号相关信息的脚本

using System;
using System.Collections;
using System.Collections.Generic;
using System.Windows.Forms;
using System.IO;
using System.Text;
using System.Xml;

using dp2Circulation;

using DigitalPlatform.Marc;
using DigitalPlatform.Xml;
using DigitalPlatform.Script;
using DigitalPlatform.Text;

public class MyMarcQueryHost : MarcQueryHost
{
                XmlTextWriter writer = null;
    string _outputDir = "";
    int _fileIndex = 1;
    int _recordCount = 0;

    public override void OnBegin(object sender, StatisEventArgs e)
    {

            FolderBrowserDialog dir_dlg = new FolderBrowserDialog();

            dir_dlg.Description = "请指定输出文件所在目录:";
            dir_dlg.RootFolder = Environment.SpecialFolder.MyComputer;
            dir_dlg.ShowNewFolderButton = true;
            dir_dlg.SelectedPath = "c:\\temp\\test_author";

            if (dir_dlg.ShowDialog() != DialogResult.OK)
    {
        e.Continue = ContinueType.Error;
        e.ParamString = "取消";
                    return;
    }

    _outputDir = dir_dlg.SelectedPath;

    }

    string GetOutputFileName()
    {
        return Path.Combine(_outputDir, "test_author_" + (_fileIndex++) + ".xml");
    }

    void BeginOutputFile(string strFileName)
    {
        EndOutputFile();

                        writer = new XmlTextWriter(strFileName, Encoding.UTF8);
                    writer.Formatting = Formatting.Indented;
                    writer.Indentation = 4;
                writer.WriteStartDocument();

                    writer.WriteStartElement("collection");
    }

    void EndOutputFile()
    {
                    if (writer != null)
                    {
                    writer.WriteEndElement();
                    writer.WriteEndDocument();
                            writer.Close();
                            writer = null;
                    }
    }

    public override void OnRecord(object sender, StatisEventArgs e)
    {
        if ((_recordCount % 1000) == 0)
            BeginOutputFile(GetOutputFileName());

                    string strAuthor = "";
                    string strPinyin = "";
                    string strError = "";
        // 获得一个著者字符串和对应的拼音
                // return:
                //      -1  出错
                //      0   没有找到
                //      1   找到
                int nRet = DetailHost.GetAuthorAndPinyin(this.MarcRecord,
            out strAuthor,
            out strPinyin,
            out strError);
        if (nRet == -1)
        {
            e.Continue = ContinueType.Error;
            e.ParamString = "取消";
                        return;
        }

        string access_no = this.MarcRecord.select("field[@name='905']/subfield[@name='f']").FirstContent;
        string number = "";
        List<string> parts = StringUtil.ParseTwoPart(access_no, "/");
        number = parts[1];

        if (number.Length > 4)
            number = number.Substring(0, 4);

                    writer.WriteStartElement("item");
                    writer.WriteAttributeString("author", strAuthor);
                    writer.WriteAttributeString("number", number);
                    writer.WriteAttributeString("pinyin", strPinyin);
        writer.WriteAttributeString("recPath", this.RecordPath);
                    writer.WriteEndElement();

        _recordCount ++;
    }

    public override void OnEnd(object sender, StatisEventArgs e)
    {
        EndOutputFile();
    }

    public override void FreeResources()
            {
        EndOutputFile();
    }
}
DigitalPlatform commented 5 years ago

第一批发现不一致的著者号

=== 共发现 81 个问题 === 1) '中国企业家杂志'(Zhong Guo Qi Ye Jia Za Zhi) --> 'Z612',和 'Z548' 不一致。记录路径 源书目/1 2) '克拉克'() --> 'K633',和 'K600' 不一致。记录路径 源书目/36 3) '蔡锷'(cai e) --> 'C020',和 'C021' 不一致。记录路径 源书目/50 4) '李师东'(li shi dong) --> 'L260',和 'L120' 不一致。记录路径 源书目/73 5) '程颢,'() --> 'C746',和 'C783' 不一致。记录路径 源书目/85 6) '西蒙·佩雷斯'(xi meng · pei lei si) --> 'X064',和 'X060' 不一致。记录路径 源书目/88 7) '扎基'(zha ji) --> 'Z035',和 'Z037' 不一致。记录路径 源书目/107 8) '国家体育总局'(Guo Jia Ti Yu Zong Ju) --> 'G932',和 'G935' 不一致。记录路径 源书目/108 9) '上海外语教育出版社'() --> 'S294',和 'S296' 不一致。记录路径 源书目/132 10) '玛格丽塔,'() --> 'M252',和 'S709' 不一致。记录路径 源书目/138 经查,MARC 数据中是用了 701 作为著者号来源

700 1$a玛格丽塔,$bJ.$g(Magretta, Joan)$4著#
701 1$a斯通,$bN.$g(Stone, Nan)$4著#

是否凡是这种 700 和 701 在一起的,都要用 701?

11) '缪柏其'(miu bai qi) --> 'M747',和 'MXXX' 不一致。记录路径 源书目/156 12) '中华人民共和国民办教育促进法'(Zhong Hua Ren Min Gong He Guo Min Ban Jiao Yu Cu Jin Fa) --> 'Z672',和 'ZXXX' 不一致。记录路径 源书目/182 13) '库泽斯,'() --> 'K896',和 'B864' 不一致。记录路径 源书目/186

注:经查这条记录的 7xx 字段为

700 1$a库泽斯,$bJ. M.$g(Kouzes, James M.),$f1945-$4著#
701 1$a波斯纳,$bB. Z.$g(Posner, Barry Z.)$4著#
702 0$a李丽林$4译#
702 0$a杨振东$4译#

B864 应为 701 字段“波斯纳”的著者号。

14) '徐友渔'() --> 'X838',和 'S490' 不一致。记录路径 源书目/193

700 0$a徐友渔#
701 0$a施兰格$AShi Lan Ge#

又是用了 701

15) '解嬿嬿'(Jie Yan Yan) --> 'X503',和 'J503' 不一致。记录路径 源书目/203

"解"在用作姓的时候,应该是 Xie 吧?但即便是 J,也应该是 J739 啊

16) '芥川龙之介'(jie chuan long zhi jie) --> 'J743',和 'G743' 不一致。记录路径 源书目/204

17) '柏杨'(Bai Yang) --> 'B928',和 'B167' 不一致。记录路径 源书目/211

到底是 Bai Yang,还是 Bo Yang 呢?

18) '陈进'(chen jin) --> 'C475',和 'C350' 不一致。记录路径 源书目/246 19) '于冰'(yu bing) --> 'Y701',和 '' 不一致。记录路径 源书目/299

20) '吴创之,'() --> 'W759',和 'M094' 不一致。记录路径 源书目/308

700 0$a吴创之,$f1965-$4主编#
701 0$a马隆龙,$f1964-$4主编#

21) '历史哲学经典选读'(li shi zhe xue jing dian xuan du) --> 'L358',和 'B012' 不一致。记录路径 源书目/325

注:经查这条记录的 7xx 字段为 701 0$c美$aRobert M.Burns$4著# 编目员似应著录其汉译名,然后才能根据汉字取著者号

22) '东方·卓越'(Dong Fang Zhuo Yue) --> 'D664',和 'D660' 不一致。记录路径 源书目/339 23) '蒋珊'(jiang shan) --> 'J585',和 'L698' 不一致。记录路径 源书目/374

600 0$a刘秀$f前6-57$x传记$ALiu Xiu#
690  $aK827=21$v4#
701 0$a蒋珊$9jiang shan$4编著$AJiang Shan#

24) '马俊英'(ma jun ying) --> 'M079',和 'Z899' 不一致。记录路径 源书目/375

600 0$a朱元璋$f1328-1398$x传记#
690  $aK827$v4#
701 0$a马俊英$9ma jun ying$4编著#

25) '肖于波'() --> 'X295',和 'C137' 不一致。记录路径 源书目/385

700 0$a肖于波$4编著#
701 0$a曹庆新$4编著#

26) '数据结构Java语言描述'(shu ju jie gouJ ava yu yan miao shu) --> 'S661',和 'B12' 不一致。记录路径 源书目/387

701 1$aBailey$bDuane A.$4著#

27) '朗讯科技(中国)有限公司 光网络部'() --> 'L056',和 'G587' 不一致。记录路径 源书目/422

经测试,是“光网络部”取的号码 G587

28) '林语堂'(Lin Yu Tang) --> 'L526',和 'L537' 不一致。记录路径 源书目/426 29) '中国社会科学院新闻研究所新闻研究资料编辑部'(zhong guo she hui ke xue yuan xin wen yan jiu suo xin wen yan jiu zi liao bian ji bu) --> 'Z652',和 'Z643' 不一致。记录路径 源书目/469 30) '教育部考试中心'(Jiao Yu Bu Kao Shi Zhong Xin) --> 'G911',和 'J688' 不一致。记录路径 源书目/471

31) '闫卫星'(yan wei xing) --> '',和 'Y136' 不一致。记录路径 源书目/486

GCAT 数据库缺字“闫”

32) '种明章'(zhong ming zhang) --> 'Z742',和 'Z920' 不一致。记录路径 源书目/489 33) '科学出版社'(Ke Xue Chu Ban She) --> 'K543',和 'K542' 不一致。记录路径 源书目/509 34) '王大钧'(wang da jun) --> 'W142',和 'W090' 不一致。记录路径 源书目/527 35) '穆尔,'() --> 'M969',和 'D155' 不一致。记录路径 源书目/543

700 1$a穆尔,$bD.$g(Moore, Dana)$4著#
701 1$a丹诺$bJ.$g(Hebeler, John)$4著#
702 0$a苏忠$4译#
702 0$a战晓雷$4译#

36) '胡道元'() --> 'H468',和 'Y223' 不一致。记录路径 源书目/545

700 0$a胡道元$4编著#
701 0$a杨莉$4编著#
701 0$a郝育新$4编著#

37) '科学出版社'() --> 'K543',和 'K542' 不一致。记录路径 源书目/548 38) '中国科学院'(Zhong Guo Ke Xue Yuan) --> 'Z580',和 'Z643' 不一致。记录路径 源书目/587 39) '人民出版社编辑'(Ren Min Chu Ban She Bian Ji) --> 'R172',和 'R168' 不一致。记录路径 源书目/613 40) '政协全国委员会'(Zheng Xie Quan Guo Wei Yuan Hui) --> 'Z464',和 'Z465' 不一致。记录路径 源书目/621 41) '陈亮恭'(Chen Liang Gong) --> 'C501',和 'C491' 不一致。记录路径 源书目/624 42) '顾嗣立'(Gu Si Li) --> 'G503',和 'G477' 不一致。记录路径 源书目/670 43) '傅经顺'(Fu Jing Shun) --> 'F926',和 'F171' 不一致。记录路径 源书目/679

44) '中山大学历史系孙中山研究室'(zhong shan da xue li shi xi sun zhong shan yan jiu shi) --> 'Z693',和 'S990' 不一致。记录路径 源书目/683 45) '刘熹编'(Liu Xi Bian) --> 'L690',和 'L693' 不一致。记录路径 源书目/685 46) '星灿'(xing can) --> 'X600',和 'X501' 不一致。记录路径 源书目/687 47) '高中甫'(Gao Zhong Fu) --> 'G211',和 'G259' 不一致。记录路径 源书目/691 48) '(本书)编委会'(( Ben Shu ) Bian Wei Hui) --> 'B715',和 'C943' 不一致。记录路径 源书目/696

经测试是用了“辞海”作为著者字符串。

49) '南京工学院等七所工科院校'(Nan Jing Gong Xue Yuan Deng Qi Suo Gong Ke Yuan Xiao) --> 'N122',和 'N120' 不一致。记录路径 源书目/698 50) '徐朔方'(Xu Shuo Fang) --> 'X801',和 'X891' 不一致。记录路径 源书目/709 51) '刘廷先'(liu ting xian) --> 'L687',和 'L707' 不一致。记录路径 源书目/710 52) '浙江农业大学'() --> 'Z383',和 'Y690' 不一致。记录路径 源书目/716

经测试是用了“有机化学”作为著者字符串。

53) '华东理工大学机械制图教研组'(Hua Dong Li Gong Da Xue Ji Xie Zhi Tu Jiao Yan Zu) --> 'H668',和 'H665' 不一致。记录路径 源书目/729 54) '伯恩斯'(bo en si) --> 'B913',和 'L951' 不一致。记录路径 源书目/735

600 1$a罗斯福$ALuo Si Fu$bF.D.$x生平事迹#
606  $a总统$AZong Tong$x生平事迹$y美国$z现代#
690  $aK837.121$v4#
701 1$a伯恩斯$Abo en si$bJ.M.$e美$4著#
701A1$aBurns$bJ.M.$4著#
702 0$a孙天义$Asun tian yi$4译#
702 0$a马继森$Ama ji sen$4译#
702 0$a冉隆勃$Aran long bo$4译#

55) '中国人民大学清史研究所'(Zhong Guo Ren Min Xue Qing Shi Yan Jiu Suo) --> 'Z619',和 'Z617' 不一致。记录路径 源书目/750 56) '中华全国总工会办公厅'(Zhong Hua Quan Guo Zong Gong Hui Ban Gong Ting) --> 'Z671',和 'Z546' 不一致。记录路径 源书目/752 57) '吉甘'(Ji Gan) --> 'J064',和 'H064' 不一致。记录路径 源书目/755 58) '电影电视歌曲选'(dian ying dian shi ge qu xuan) --> 'D480',和 'H648' 不一致。记录路径 源书目/773 59) '林有禹'(lin you yu) --> 'L528',和 'L538' 不一致。记录路径 源书目/784 60) '上海市黄浦区东昌路街道医院革委会'(shang hai shi huang pu qu dong chang lu jie dao yi yuan ge wei hui) --> 'S254',和 'S214' 不一致。记录路径 源书目/795 61) '太平正芳'(Tai Ping Zheng Fang) --> 'T064',和 'T066' 不一致。记录路径 源书目/811 62) '北京师范大学等无机化学教研室编'() --> 'B593',和 'B600' 不一致。记录路径 源书目/813 63) '北京工业学院自动控制系电子电路教研室'(Bei Jing Gong Ye Xue Yuan Zi Dong Kong Zhi Ji Dian Zi Dian Lu Jiao Yan Shi) --> 'B428',和 'B518' 不一致。记录路径 源书目/832 64) '南京大学物理系应用电子学教研室'(Nan Jing Da Xue Wu Li Xi Ying Yong Dian Zi Xue Jiao Yan Shi) --> 'N108',和 'N109' 不一致。记录路径 源书目/845 65) '哈尔滨建筑工程学院基础部制图教研室'(ha er bin jian zhu gong cheng xue yuan ji chu bu zhi tu jiao yan shi) --> 'H015',和 'H013' 不一致。记录路径 源书目/865 66) '吴浊流'(Wu Zhuo Liu) --> 'W923',和 'W737' 不一致。记录路径 源书目/882 67) '石立唢'(Shi Li Suo) --> 'S534',和 'S531' 不一致。记录路径 源书目/883 68) '刘志鹗'(liu zhi e) --> 'L730',和 'A462' 不一致。记录路径 源书目/900

600 1$a爱斯奇里斯$x生平事迹$AAi Si Qi Li Si#
606  $a悲剧-文学评论$y希腊$z近代$ABei Ju- Wen Xue Ping Lun#
606  $a文学评论-悲剧$y希腊$z近代$AWen Xue Ping Lun- Bei Ju#
690  $aK835.4556$v4#
701 0$a刘志鹗$Aliu zhi e$4著#

69) '西北大学中文系'(xi bei da xue zhong wen xi) --> 'X043',和 'S166' 不一致。记录路径 源书目/904

经测试是用了“陕西新诗选”作为著者字符串

70) '臧旭恒'(ZANG XU HENG) --> 'Z012',和 'Z013' 不一致。记录路径 源书目/917 71) '湖南二三0研究所 '(Hu Nan Er San0 Yan Jiu Suo ) --> 'H590',和 'H448' 不一致。记录路径 源书目/920 72) '迈克尔·哈林顿'(Mai Ke Er· Ha Lin Dun) --> 'M268',和 'H022' 不一致。记录路径 源书目/925

73) '谢尔盖耶夫(Сергеев,Б.Ф.)'(xie er gai ye fu (Сергеев,Б.Ф.)) --> 'X431',和 'X461' 不一致。记录路径 源书目/939 74) '中国美术全集编辑委员会'(Zhong Guo Mei Shu Quan Ji Bian Ji Wei Yuan Hui) --> 'Z599',和 'Z596' 不一致。记录路径 源书目/960 75) '徐文'(xu wen) --> 'X815',和 'X811' 不一致。记录路径 源书目/968 76) '嫏嬛山樵'(lang Huan Shan Qiao) --> '',和 'L055' 不一致。记录路径 源书目/974

GCAT 数据库中缺字

77) '教育部高等教育司'(Jiao Yu Bu Gao Deng Jiao Yu Si) --> 'G910',和 'J688' 不一致。记录路径 源书目/987

78) '李连庆'(li lian qing) --> 'L205',和 'L824' 不一致。记录路径 源书目/989 79) '杨子胥'(yang zi xu) --> 'Y337',和 'Y334' 不一致。记录路径 源书目/992 80) '徐渭'(Xu Wei) --> 'X813',和 'X810' 不一致。记录路径 源书目/994 81) '北京图书馆《文献》丛刊编辑部'(Bei Jing Tu Shu Guan《 Wen Xian》 Cong Kan Bian Ji Bu) --> 'B627',和 'B618' 不一致。记录路径 源书目/999

DigitalPlatform commented 5 years ago

第二批

=== 共发现 51 个问题 === 1) '阿诗玛(撒尼民间叙事长诗)'(ZHAO HUA XI SHI) --> 'A184',和 'Y975' 不一致。记录路径 源书目/1048

注:

711 $a云南省人民文工团圭山工作组$AYun Nan Sheng Ren Min Wen Gong Tuan Gui Shan Gong Zuo Zu$4搜集#

711 字段的指示符少了一个字符,因此软件无法正确识别其中的 $a 了。

已经将测试条目修改为:

  <item author="云南省人民文工团圭山工作组" number="Y975" pinyin="Yun Nan Sheng Ren Min Wen Gong Tuan Gui Shan Gong Zuo Zu" recPath="源书目/1048" />

另外顺便发现:

20010$a阿诗玛(撒尼民间叙事长诗)$AZHAO HUA XI SHI$f云南省人民文工团圭山工作组著$FLU   XUN ZHU#

200 $A 和 $a 不对应

2) '霍有光'(HUO YOU GUANG) --> 'H979',和 'S701' 不一致。记录路径 源书目/1083

注:原数据里面似乎弄成“司马迁”的著者号了。S701

3) '中国人民解放军51116部队理论组'(jie fang jun 51116 bu dui li lun zu) --> 'J720',和 'Z720' 不一致。记录路径 源书目/1108

注:“中国人民解放军”应该按照“解放军”取号。J720 没有错。

4) '政协上海市委员会文史资料工作委员会'(zheng xie shang hai shi wei yuan hui wen shi zi liao gong zuo wei yuan hui) --> 'Z464',和 'Z636' 不一致。记录路径 源书目/1115

注:Z636 应该是按照“中国人民政治协商会议”来取得的。考虑一下 GCAT XML 数据中给“政协”做一个参见条目?

5) '吴唏'(wu xi) --> 'W893',和 'C897' 不一致。记录路径 源书目/1117 6) '中国科学院大连化学物理研究所'(Zhong Guo Ke Xue Yuan Da Lian Hua Xue Wu Li Yan Jiu Suo) --> 'Z582',和 'Z580' 不一致。记录路径 源书目/1145 7) '潘菽'(Pan Shu) --> 'P228',和 'P188' 不一致。记录路径 源书目/1149 8) '中国科学技术情报研究所重庆分所'(zhong guo ke xue ji shu qing bao yan jiu suo chong qing fen suo) --> 'Z572',和 'Z570' 不一致。记录路径 源书目/1155 9) '米暂沉'(Mi Zhan Chen) --> 'M685',和 'M665' 不一致。记录路径 源书目/1173 10) '庄司浅水'(zhuang si jian shui) --> 'Z928',和 'Z929' 不一致。记录路径 源书目/1193 11) '闫承利'(YAN CHENG LI) --> '',和 'Y086' 不一致。记录路径 源书目/1213 12) '金冲及'(jin chong ji) --> 'J752',和 'J839' 不一致。记录路径 源书目/1230 13) '《中药麻醉的临床应用与探讨》编写组'(《 Zhong Yao Ma Zui De Lin Chuang Ying Yong Yu Tan Tao》 Bian Xie Zu) --> 'Z708',和 'Z706' 不一致。记录路径 源书目/1252 14) '关甦霞'(Guan Su Xia) --> 'G551',和 'G552' 不一致。记录路径 源书目/1258 15) '第一机械工业部'(Di Yi Ji Xie Gong Ye Bu) --> 'D424',和 'D423' 不一致。记录路径 源书目/1259 16) '秦翰才'(qin han cai) --> 'Q400',和 'Z992' 不一致。记录路径 源书目/1263 17) '乔清昶'(qiao qing chang) --> 'Q330',和 'Q333' 不一致。记录路径 源书目/1276 18) '鲍劲夫'(bao jin fu) --> 'B298',和 'B291' 不一致。记录路径 源书目/1283 19) '中国社科院哲学研究所,<<哲学研究>>编辑部'(Zhong Guo She Ke Yuan Zhe Xue Yan Jiu Suo ,<< Zhe Xue Yan Jiu >> Bian Ji Bu) --> 'Z638',和 'Z652' 不一致。记录路径 源书目/1287 20) '闵嗣鹤'(min si he) --> 'M791',和 'M76/' 不一致。记录路径 源书目/1304 21) '浙江人民美术出版社编'(Zhe Jiang Ren Min Mei Shu Chu Ban She Bian) --> 'Z382',和 'Z371' 不一致。记录路径 源书目/1307 22) '合力'(he li) --> 'H157',和 'M538' 不一致。记录路径 源书目/1316 23) '刘铮'(liu zheng) --> 'L722',和 'L720' 不一致。记录路径 源书目/1322 24) '郝懿行'(Hao Yi Heng) --> 'H143',和 'H145' 不一致。记录路径 源书目/1334 25) '暨南大学系'(ji nan da xue xi) --> 'J200',和 'J159' 不一致。记录路径 源书目/1339 26) '彭卫'(Peng Wei) --> 'P563',和 'P560' 不一致。记录路径 源书目/1342 27) '中共中央马克思 恩格斯 列宁 斯大林著作编译局编'(Zhong Gong Zhong Yang Ma Ke Si En Ge Si Lie Ning Si Da Lin Zhu Zuo Bian Yi Ju Bian) --> 'Z546',和 ':Z54' 不一致。记录路径 源书目/1362 28) '蔡文显'(Cai Wen Xian) --> 'C067',和 'S823' 不一致。记录路径 源书目/1401 29) '夏里亚宾'(xia li ya bin) --> 'X200',和 'X198' 不一致。记录路径 源书目/1410 30) '浙江人民美术出版社编'(Zhe Jiang Ren Min Mei Shu Chu Ban She Bian) --> 'Z382',和 'Z371' 不一致。记录路径 源书目/1460 31) '崔珣'() --> 'C977',和 'C975' 不一致。记录路径 源书目/1500 32) '林正'(lin zheng) --> 'L542',和 'D155' 不一致。记录路径 源书目/1507 33) '基辛格'(ji xin ge) --> 'J047',和 'J043' 不一致。记录路径 源书目/1510 34) '杨振山'(yang zhen shan) --> 'Y336',和 'Y819' 不一致。记录路径 源书目/1512 35) '中国社会科学院农村发展研究所'(zhong guo she hui ke xue yuan nong cun fa zhan yan jiu suo) --> 'Z647',和 'Z649' 不一致。记录路径 源书目/1529 36) '中共中央马克思恩格斯列宁斯大林著作编译局'(Zhong Gong Zhong Yang Ma Ke Si En Ge Si Lie Ning Si Da Lin Zhu Zuo Bian Yi Ju) --> 'Z546',和 'L476' 不一致。记录路径 源书目/1535 37) '张兰芳'(zhang lan fang) --> 'Z131',和 'H114' 不一致。记录路径 源书目/1565 38) '侯树栋'(hou shu dong) --> 'H429',和 'C635' 不一致。记录路径 源书目/1595 39) '巴图'(ba tu) --> 'B068',和 'G132' 不一致。记录路径 源书目/1600 40) '瑞利,'(rui li,) --> 'R930',和 'K656' 不一致。记录路径 源书目/1603 41) '张雪兰'(zhang xue lan) --> 'Z213',和 'M536' 不一致。记录路径 源书目/1633 42) '陈泳超'(chen yong chao) --> 'C620',和 'Y620' 不一致。记录路径 源书目/1648 43) '徐威'(xu wei) --> 'X813',和 'X811' 不一致。记录路径 源书目/1668 44) '王璞'(wang pu) --> 'W308',和 'W298' 不一致。记录路径 源书目/1699 45) '方舟工作室'(fang zhou gong zuo shi) --> 'F271',和 'f279' 不一致。记录路径 源书目/1718 46) '无名氏9Awu ming shi'(wu ming shi 9Awu ming shi) --> 'W734',和 'W731' 不一致。记录路径 源书目/1720 47) '中国社会科学院科学院科研局'(zhong guo she hui ke xue yuan ke xue yuan ke yan ju) --> 'Z649',和 'W768' 不一致。记录路径 源书目/1725 48) '木杉'(mu sha) --> 'M946',和 'M948' 不一致。记录路径 源书目/1743 49) '罗曼·罗兰'(Luo Man· Luo Lan) --> 'L953',和 'B675' 不一致。记录路径 源书目/1752 50) '林语堂'(lin yu tang) --> 'L526',和 'L537' 不一致。记录路径 源书目/1784 51) '柯文'(ke wen) --> 'K435',和 'W366' 不一致。记录路径 源书目/1789

DigitalPlatform commented 5 years ago

改进后的脚本

K 类采用 600$a 作为著者字符串。

using System;
using System.Collections;
using System.Collections.Generic;
using System.Windows.Forms;
using System.IO;
using System.Text;
using System.Xml;

using dp2Circulation;

using DigitalPlatform.Marc;
using DigitalPlatform.Xml;
using DigitalPlatform.Script;
using DigitalPlatform.Text;

public class MyMarcQueryHost : MarcQueryHost
{
                XmlTextWriter writer = null;
    string _outputDir = "";
    int _fileIndex = 1;
    int _recordCount = 0;

    public override void OnBegin(object sender, StatisEventArgs e)
    {

            FolderBrowserDialog dir_dlg = new FolderBrowserDialog();

            dir_dlg.Description = "请指定输出文件所在目录:";
            dir_dlg.RootFolder = Environment.SpecialFolder.MyComputer;
            dir_dlg.ShowNewFolderButton = true;
            dir_dlg.SelectedPath = "c:\\temp\\test_author";

            if (dir_dlg.ShowDialog() != DialogResult.OK)
    {
        e.Continue = ContinueType.Error;
        e.ParamString = "取消";
                    return;
    }

    _outputDir = dir_dlg.SelectedPath;

    }

    string GetOutputFileName()
    {
        return Path.Combine(_outputDir, "test_author_" + (_fileIndex++) + ".xml");
    }

    void BeginOutputFile(string strFileName)
    {
        EndOutputFile();

                        writer = new XmlTextWriter(strFileName, Encoding.UTF8);
                    writer.Formatting = Formatting.Indented;
                    writer.Indentation = 4;
                writer.WriteStartDocument();

                    writer.WriteStartElement("collection");
    }

    void EndOutputFile()
    {
                    if (writer != null)
                    {
                    writer.WriteEndElement();
                    writer.WriteEndDocument();
                            writer.Close();
                            writer = null;
                    }
    }

    public override void OnRecord(object sender, StatisEventArgs e)
    {
        if ((_recordCount % 1000) == 0)
            BeginOutputFile(GetOutputFileName());

                    string strAuthor = "";
                    string strPinyin = "";
                    string strError = "";
        // 获得一个著者字符串和对应的拼音
                // return:
                //      -1  出错
                //      0   没有找到
                //      1   找到
                int nRet = GetAuthorAndPinyin(this.MarcRecord,
            out strAuthor,
            out strPinyin,
            out strError);
        if (nRet == -1)
        {
            e.Continue = ContinueType.Error;
            e.ParamString = "取消";
                        return;
        }

        string access_no = this.MarcRecord.select("field[@name='905']/subfield[@name='f']").FirstContent;
        string number = "";
        List<string> parts = StringUtil.ParseTwoPart(access_no, "/");
        number = parts[1];

        if (number.Length > 4)
            number = number.Substring(0, 4);

                    writer.WriteStartElement("item");
                    writer.WriteAttributeString("author", strAuthor);
                    writer.WriteAttributeString("number", number);
                    writer.WriteAttributeString("pinyin", strPinyin);
        writer.WriteAttributeString("recPath", this.RecordPath);
                    writer.WriteEndElement();

        _recordCount ++;
    }

    public override void OnEnd(object sender, StatisEventArgs e)
    {
        EndOutputFile();
    }

    public override void FreeResources()
            {
        EndOutputFile();
    }

    // 特化版本
        // 获得一个著者字符串和对应的拼音
        // return:
        //      -1  出错
        //      0   没有找到
        //      1   找到
        public static int GetAuthorAndPinyin(MarcRecord record,
            out string strAuthor,
            out string strPinyin,
            out string strError)
        {
            strError = "";
            strAuthor = "";
            strPinyin = "";

            MarcNodeList fields = new MarcNodeList();
    var class_string = record.select("field[@name='690']/subfield[@name='a']").FirstContent;
    if (string.IsNullOrEmpty(class_string) == false && class_string.StartsWith("K"))
        fields = record.select("field[@name='600']");
            fields.add(record.select("field[@name='701' or @name='702' or @name='710' or @name='711' or @name='712']"));    // 故意不取 700
            fields.add(record.select("field[@name='200']")); // 必须两次分别 select。因为 200 一般在 MARC 记录中会先出现
            foreach (MarcNode field in fields)
            {
                if ((field.Name == "700" || field.Name == "701" || field.Name == "702")
                    && field.Indicator1 == 'A')
                    continue;

                string a = field.select("subfield[@name='a']").FirstContent;
                if (string.IsNullOrEmpty(a))
                    continue;

                // if (ContainHanzi(a) == false)
                //    continue;

                // 看看是否有 $9
                string sub_9 = field.select("subfield[@name='9']").FirstContent;

                // 2018/11/19
                // 如果没有 $9,则尝试找 $A
                if (string.IsNullOrEmpty(sub_9))
                    sub_9 = field.select("subfield[@name='A']").FirstContent;

                strPinyin = sub_9;

                strAuthor = a;
                return 1;
            }

            return 0;
        }
}
DigitalPlatform commented 5 years ago

用新的脚本进行测试,第一批发现的问题: (为节省测试精力,特意忽略了著者号和期待的第一个字母明显不同的情况。这种情况一般是从 MARC 记录中著者字符串提取问题,不是创建著者号的问题)

=== 共发现 49 个问题 === 1) '中国企业家杂志'(Zhong Guo Qi Ye Jia Za Zhi) --> 'Z612',和 'Z548' 不一致。记录路径 源书目/1 2) '克拉克'() --> 'K633',和 'K600' 不一致。记录路径 源书目/36 3) '蔡锷'(cai e) --> 'C020',和 'C021' 不一致。记录路径 源书目/50 4) '李师东'(li shi dong) --> 'L260',和 'L120' 不一致。记录路径 源书目/73 5) '西蒙·佩雷斯'(xi meng · pei lei si) --> 'X064',和 'X060' 不一致。记录路径 源书目/88 6) '扎基'(zha ji) --> 'Z035',和 'Z037' 不一致。记录路径 源书目/107 7) '国家体育总局'(Guo Jia Ti Yu Zong Ju) --> 'G932',和 'G935' 不一致。记录路径 源书目/108 8) '上海外语教育出版社'() --> 'S294',和 'S296' 不一致。记录路径 源书目/132 9) '缪柏其'(miu bai qi) --> 'M747',和 'MXXX' 不一致。记录路径 源书目/156 10) '中华人民共和国民办教育促进法'(Zhong Hua Ren Min Gong He Guo Min Ban Jiao Yu Cu Jin Fa) --> 'Z672',和 'ZXXX' 不一致。记录路径 源书目/182 11) '马雅可夫斯基,'(Ma Ya Ke Fu Si Ji) --> 'M214',和 'M663' 不一致。记录路径 源书目/206 12) '柏杨'(Bai Yang) --> 'B928',和 'B167' 不一致。记录路径 源书目/211 13) '陈进'(chen jin) --> 'C475',和 'C350' 不一致。记录路径 源书目/246 14) '东方·卓越'(Dong Fang Zhuo Yue) --> 'D664',和 'D660' 不一致。记录路径 源书目/339 15) '林语堂'(Lin Yu Tang) --> 'L526',和 'L537' 不一致。记录路径 源书目/426 16) '中国社会科学院新闻研究所新闻研究资料编辑部'(zhong guo she hui ke xue yuan xin wen yan jiu suo xin wen yan jiu zi liao bian ji bu) --> 'Z652',和 'Z643' 不一致。记录路径 源书目/469 17) '种明章'(zhong ming zhang) --> 'Z742',和 'Z920' 不一致。记录路径 源书目/489 18) '科学出版社'(Ke Xue Chu Ban She) --> 'K543',和 'K542' 不一致。记录路径 源书目/509 19) '王大钧'(wang da jun) --> 'W142',和 'W090' 不一致。记录路径 源书目/527 20) '科学出版社'() --> 'K543',和 'K542' 不一致。记录路径 源书目/548 21) '中国科学院'(Zhong Guo Ke Xue Yuan) --> 'Z580',和 'Z643' 不一致。记录路径 源书目/587 22) '人民出版社编辑'(Ren Min Chu Ban She Bian Ji) --> 'R172',和 'R168' 不一致。记录路径 源书目/613 23) '政协全国委员会'(Zheng Xie Quan Guo Wei Yuan Hui) --> 'Z464',和 'Z465' 不一致。记录路径 源书目/621 24) '陈亮恭'(Chen Liang Gong) --> 'C501',和 'C491' 不一致。记录路径 源书目/624 25) '张謇'(Zhang Jian) --> 'Z125',和 'Z265' 不一致。记录路径 源书目/646 26) '顾嗣立'(Gu Si Li) --> 'G503',和 'G477' 不一致。记录路径 源书目/670 27) '刘熹编'(Liu Xi Bian) --> 'L690',和 'L693' 不一致。记录路径 源书目/685 28) '星灿'(xing can) --> 'X600',和 'X501' 不一致。记录路径 源书目/687 29) '南京工学院等七所工科院校'(Nan Jing Gong Xue Yuan Deng Qi Suo Gong Ke Yuan Xiao) --> 'N122',和 'N120' 不一致。记录路径 源书目/698 30) '徐朔方'(Xu Shuo Fang) --> 'X801',和 'X891' 不一致。记录路径 源书目/709 31) '华东理工大学机械制图教研组'(Hua Dong Li Gong Da Xue Ji Xie Zhi Tu Jiao Yan Zu) --> 'H668',和 'H665' 不一致。记录路径 源书目/729 32) '中国人民大学清史研究所'(Zhong Guo Ren Min Xue Qing Shi Yan Jiu Suo) --> 'Z619',和 'Z617' 不一致。记录路径 源书目/750 33) '中华全国总工会办公厅'(Zhong Hua Quan Guo Zong Gong Hui Ban Gong Ting) --> 'Z671',和 'Z546' 不一致。记录路径 源书目/752 34) '林有禹'(lin you yu) --> 'L528',和 'L538' 不一致。记录路径 源书目/784 35) '上海市黄浦区东昌路街道医院革委会'(shang hai shi huang pu qu dong chang lu jie dao yi yuan ge wei hui) --> 'S254',和 'S214' 不一致。记录路径 源书目/795 36) '北京师范大学等无机化学教研室编'() --> 'B593',和 'B600' 不一致。记录路径 源书目/813 37) '北京工业学院自动控制系电子电路教研室'(Bei Jing Gong Ye Xue Yuan Zi Dong Kong Zhi Ji Dian Zi Dian Lu Jiao Yan Shi) --> 'B428',和 'B518' 不一致。记录路径 源书目/832 38) '南京大学物理系应用电子学教研室'(Nan Jing Da Xue Wu Li Xi Ying Yong Dian Zi Xue Jiao Yan Shi) --> 'N108',和 'N109' 不一致。记录路径 源书目/845 39) '哈尔滨建筑工程学院基础部制图教研室'(ha er bin jian zhu gong cheng xue yuan ji chu bu zhi tu jiao yan shi) --> 'H015',和 'H013' 不一致。记录路径 源书目/865 40) '吴浊流'(Wu Zhuo Liu) --> 'W923',和 'W737' 不一致。记录路径 源书目/882 41) '石立唢'(Shi Li Suo) --> 'S534',和 'S531' 不一致。记录路径 源书目/883 42) '臧旭恒'(ZANG XU HENG) --> 'Z012',和 'Z013' 不一致。记录路径 源书目/917 43) '湖南二三0研究所 '(Hu Nan Er San0 Yan Jiu Suo ) --> 'H590',和 'H448' 不一致。记录路径 源书目/920 44) '谢尔盖耶夫(Сергеев,Б.Ф.)'(xie er gai ye fu (Сергеев,Б.Ф.)) --> 'X431',和 'X461' 不一致。记录路径 源书目/939 45) '中国美术全集编辑委员会'(Zhong Guo Mei Shu Quan Ji Bian Ji Wei Yuan Hui) --> 'Z599',和 'Z596' 不一致。记录路径 源书目/960 46) '徐文'(xu wen) --> 'X815',和 'X811' 不一致。记录路径 源书目/968 47) '杨子胥'(yang zi xu) --> 'Y337',和 'Y334' 不一致。记录路径 源书目/992 48) '徐渭'(Xu Wei) --> 'X813',和 'X810' 不一致。记录路径 源书目/994 49) '北京图书馆《文献》丛刊编辑部'(Bei Jing Tu Shu Guan《 Wen Xian》 Cong Kan Bian Ji Bu) --> 'B627',和 'B618' 不一致。记录路径 源书目/999