Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

用法:多音字姓名的排序调整 #157

Open
hushidong opened this issue Mar 31, 2023 · 31 comments
Open

用法:多音字姓名的排序调整 #157

hushidong opened this issue Mar 31, 2023 · 31 comments

Comments

@hushidong
Copy link
Owner

问题:姓的多音导致排序不正确

一些姓由于有个多音(比如:曾,沈等),且常用音还不是姓名中用的音时,使用默认的中文拼音排序会导致排序错误。

比如:下面的例子:

\documentclass{article}
\usepackage{ctex}

\begin{filecontents}[force]{\jobname.bib}
@thesis{曾某某,
author    = {曾某某},
title     = {CGF建模方法与应用研究},
publisher = {科技大学},
date      = {2010},
}

@thesis{白某某,
author    = {白某某},
title     = {CGF建模方法与应用研究},
publisher = {科技大学},
date      = {2010},
}

@thesis{戴某某,
author    = {戴某某},
title     = {CGF建模方法与应用研究},
publisher = {科技大学},
date      = {2010},
}

@thesis{沈某某,
author    = {沈某某},
title     = {CGF建模方法与应用研究},
publisher = {科技大学},
date      = {2011},
}

@thesis{王某某,
author    = {王某某},
title     = {CGF建模方法与应用研究},
publisher = {科技大学},
date      = {2011},
}

@thesis{齐某某,
author    = {齐某某},
title     = {CGF建模方法与应用研究},
publisher = {科技大学},
date      = {2011},
}
\end{filecontents}

\usepackage[style=gb7714-2015ay]{biblatex} %,defernumbers=true
\addbibresource{\jobname}


\begin{document}

text\nocite{*}

\printbibliography

\end{document} 

其结果为:

图片

可以看到,曾和沈,用ceng,chen的音做了排序,所以会在dai之前。

显然这并不是我们希望的正确的排序,所以,有必要的话,我们需要做调整。

@hushidong
Copy link
Owner Author

hushidong commented Mar 31, 2023

解决方案一:在key域添加正确的拼音,并使用排序模板,使其按key域排序

默认情况下:

gb7714-2015样式不使用排序模板,只按照文献的引用顺序进行排序,所以通常不需要处理。
但若要使用一定的排序,那么就要使用排序模板:
gb7714-2015样式提供了gb7714-2015、gbnytd、gbyntd、gbynta四个排序模板都使用了key域,因此只要key域内能够填入正确的拼音就能得到正确的姓的排序。

而gb7714-2015ay样式,默认使用gb7714-2015排序模板,即以语言、作者、年份、标题、升序排列,其它gbnytd、gbyntd、gbynta 排序模板也都使用了key域,因此只要key域内能够填入正确的拼音就能得到正确的姓的排序。

所以问题的关键是如何在key域填入拼音。

第一种方式是,手动的填写。

打开bib文件,对中文的条目,添加key域,写入拼音,比如:

原来的条目为

@thesis{白某某,
author    = {白某某},
title     = {CGF建模方法与应用研究},
publisher = {科技大学},
date      = {2010},
}

修改为:

@thesis{白某某,
	author = {白某某},
	title = {CGF建模方法与应用研究},
	publisher = {科技大学},
	date = {2010},
	key = {bai2mou3mou3},
}

第二种方式是,利用bibmap工具自动填写。

bibmap工具见:https://github.com/hushidong/biblatex-map

步骤为:
(1)下载后进入binary目录,并将上一级目录下的所有的py文件拷贝到binary目录下
(2)将需要修改的a.bib文件也拷到该目录下
(3)使用命令:

bibmap.exe a.bib --nofmt --addpinyin

会得到newa.bib,其内部的每条文献都会自动的添加拼音。

比如:

%% 
%% bib file modified by bibmap.py
%% 2023-03-31T17:19:26
%% 


@thesis{曾某某,
	author = {曾某某},
	title = {CGF建模方法与应用研究},
	publisher = {科技大学},
	date = {2010},
	key = {zeng1mou3mou3},
}

@thesis{白某某,
	author = {白某某},
	title = {CGF建模方法与应用研究},
	publisher = {科技大学},
	date = {2010},
	key = {bai2mou3mou3},
}

@thesis{戴某某,
	author = {戴某某},
	title = {CGF建模方法与应用研究},
	publisher = {科技大学},
	date = {2010},
	key = {dai4mou3mou3},
}

@thesis{沈某某,
	author = {沈某某},
	title = {CGF建模方法与应用研究},
	publisher = {科技大学},
	date = {2011},
	key = {shen3mou3mou3},
}

@thesis{王某某,
	author = {王某某},
	title = {CGF建模方法与应用研究},
	publisher = {科技大学},
	date = {2011},
	key = {wang2mou3mou3},
}

@thesis{齐某某,
	author = {齐某某},
	title = {CGF建模方法与应用研究},
	publisher = {科技大学},
	date = {2011},
	key = {ji4mou3mou3},
}

因此:使用新的文件可以得到正确的结果:

\documentclass{article}
\usepackage{ctex}

\usepackage[style=gb7714-2015ay]{biblatex} %,defernumbers=true
\addbibresource{\jobname.bib}


\begin{document}

text\nocite{*}

\printbibliography

\end{document} 

结果为:
图片

@hushidong
Copy link
Owner Author

hushidong commented Mar 31, 2023

解决方案二:使用修改后的Pinyin.pm模块替换原来的Pinyin.pm使多音的姓排序正确

为避免前一种方案添加拼音到key域的操作,这里提供一种可能更为方便的方法。

由于biber在做排序时实际上是利用 perl 的 Unicode::Collation::locale 模块,其中的Pinyin.pm提供了汉字的拼音顺序,对该文件做临时的修改,可以调整多音字的顺序。

因为在参考文献排序中通常会使用字的姓名音,所以我们对这个文件做非正式的修改,并放到github上,若用户需要正确的姓的多音字排序,那么只要用该文件替换biber临时工作目录中的文件即可。注意:目前只修改了“曾”“沈”等个字,而有些没有做修改,若用户有需求后面再增加。

通常biber在第一次运行的时候,会构建一个依赖目录,这也是biber的临时工作路径,而所有的依赖文件就在其中。
在windows下通常会在临时目录temp下构建类似par-<hex_encoded_username>/cache-的目录(其它系统也是类似命名,可以搜索一下),所有的依赖包括Pinyin.pm都会在其内部,找到并替换即可(Pinyin.pm文件通常在cache-<hex-code-string>\inc\lib\Unicode\Collate\CJK下)。

Pinyin.pm原始文件:
Pinyin-origin.zip

pinyin.PM 修改后的(翟读di):
Pinyin-modified-di.zip

pinyin.PM 修改后的(翟读翟):
Pinyin-modified-zhai.zip

替换完毕后,我们即便不添加key域,同样能够排序正确:

\documentclass{article}
\usepackage{ctex}

\begin{filecontents}[force]{\jobname.bib}
@thesis{曾某某,
author    = {曾某某},
title     = {CGF建模方法与应用研究},
publisher = {科技大学},
date      = {2010},
}

@thesis{白某某,
author    = {白某某},
title     = {CGF建模方法与应用研究},
publisher = {科技大学},
date      = {2010},
}

@thesis{戴某某,
author    = {戴某某},
title     = {CGF建模方法与应用研究},
publisher = {科技大学},
date      = {2010},
}

@thesis{沈某某,
author    = {沈某某},
title     = {CGF建模方法与应用研究},
publisher = {科技大学},
date      = {2011},
}

@thesis{王某某,
author    = {王某某},
title     = {CGF建模方法与应用研究},
publisher = {科技大学},
date      = {2011},
}

@thesis{齐某某,
author    = {齐某某},
title     = {CGF建模方法与应用研究},
publisher = {科技大学},
date      = {2011},
}

\end{filecontents}

\usepackage[style=gb7714-2015ay]{biblatex} %,defernumbers=true
\addbibresource{\jobname}

\begin{document}

text\nocite{*}

\printbibliography

\end{document} 

结果为:
图片

@earthmoon
Copy link

earthmoon commented Apr 4, 2023

您好,

方案二挺感兴趣的,但是我没有用过 perl ,所以对方案二大部分内容看不懂,我只能看懂思路。想请您指导我几个问题:

在windows下通常会在临时目录temp下构建类似par-<hex_encoded_username>/cache-的目录

这个temp文件夹通常在哪个位置?我应该在这个目录直接搜索par-<hex_encoded_username>/cache-吗?

因为在参考文献排序中通常会使用字的姓名音,所以我们对这个文件做非正式的修改,并放到github上,若用户需要正确的姓的多音字排序,那么只要用该文件替换biber临时工作目录中的文件即可。注意:目前只修改了“曾”“沈”两个字,而“翟”“仇”等没有做修改,若用户有需求后面再增加。

这些应该都有需求,因为文献里随时可能出现这些姓,还有应当为tang1,默认是shang1shan4。您方便做一个小白能够看懂的修改这个pm文件多音字的教程吗?

谢谢!

@hushidong
Copy link
Owner Author

  1. 对的,biber运行会生成这个目录,你搜pinyin.PM都能搜到。

  2. 该pm也不复杂,就是把字对应的unicode从原来的位置移动到合适的位置就可以。不过,最好你们还是提需求,我来统一改好了。
    我后面把汤,单,仇也加进去吧。翟好像也有读di的姓,所以不改了。

@earthmoon
Copy link

earthmoon commented Apr 4, 2023

  1. 对的,biber运行会生成这个目录,你搜pinyin.PM都能搜到。
  2. 该pm也不复杂,就是把字对应的unicode从原来的位置移动到合适的位置就可以。不过,最好你们还是提需求,我来统一改好了。
    我后面把汤,单,仇也加进去吧。翟好像也有读di的姓,所以不改了。

北方者读(Dí音狄),迁居南方者读(Zhái音宅)。把它改成zhai2吧,因为古代的族很少见了。

这个网址总结比较全,个人感觉一次尽量全部搞清楚更省力。

麻烦了,谢谢!

@earthmoon
Copy link

为什么我搜索Pinyin.pm会出现两个目录:

"C:\Users\Office\AppData\Local\Temp\par-4f66666963655a656e67\cache-0fff6f0fbf692d8a03594920d947d8aa448181d1\inc\lib\Unicode\Collate\CJK\Pinyin.pm"
"C:\Users\Office\AppData\Local\Temp\par-4f66666963655a656e67\cache-96d297aa7563e182b1dd640f406e913a11204801\inc\lib\Unicode\Collate\CJK\Pinyin.pm"

哪一个是多余的?还是各有用途呢?

谢谢!

@hushidong
Copy link
Owner Author

hushidong commented Apr 4, 2023

你把两个最高层目录全部删掉,再次运行biber,会重新生成一个,就用那个里面的。

@earthmoon
Copy link

你全部删掉,再次运行biber,会重新生成一个,就用那个。

好的,谢谢!

@earthmoon
Copy link

再问一个技术问题,为什么别人在github上回复我,我无法在我邮箱中看到对方的邮箱地址。而您回复我,我可以看到您的邮箱地址。是哪里可以设置吗?

谢谢!

@sikouhjw
Copy link

sikouhjw commented Apr 4, 2023

再问一个技术问题,为什么别人在github上回复我,我无法在我邮箱中看到对方的邮箱地址。而您回复我,我可以看到您的邮箱地址。是哪里可以设置吗?

谢谢!

有没有可能,那不是邮箱地址,而是类似昵称的东西,只是昵称刚好是邮箱

@hushidong
Copy link
Owner Author

这个没有研究,我猜是账户设置时可能公开了?

@earthmoon
Copy link

@sikouhjw @hushidong
Screenshot 2023-04-04 113546
Screenshot 2023-04-04 113517
就很奇怪~

@earthmoon
Copy link

再问一个技术问题,为什么别人在github上回复我,我无法在我邮箱中看到对方的邮箱地址。而您回复我,我可以看到您的邮箱地址。是哪里可以设置吗?
谢谢!

有没有可能,那不是邮箱地址,而是类似昵称的东西,只是昵称刚好是邮箱

他的昵称是hushidong,但他还能显示邮箱。

@hushidong
Copy link
Owner Author

hzzmail@163.com是我的昵称,hushidong是账户名。

@earthmoon
Copy link

hzzmail@163.com是我的昵称,hushidong是账户名。

Screenshot 2023-04-04 114113
Screenshot 2023-04-04 114050

难道他没有昵称?

@earthmoon
Copy link

确实可以没有昵称,原来我也没有昵称。。。

@earthmoon
Copy link

请教师兄一个问题:

对于一个完全没有学过 perl 语言的新手,应该学习 perl5 还是 perl6(raku) 。理由是什么呢?

谢谢!

@hushidong
Copy link
Owner Author

我个人认为,无所谓哪个,都是工具而已,需要用哪个的时候就学,两者估计差别不大。

另外,pinyin.pm已经更新,见前面的连接。

@earthmoon
Copy link

你好,可以帮忙查看下Pinyin.pm这个文件里面的是不是读zhang3?默认取chang2会不会更好?

@hushidong
Copy link
Owner Author

是zhang3

@hushidong hushidong reopened this May 27, 2023
@earthmoon
Copy link

是zhang3

在 pinyin.pm 模块中,可以使用 Pinyin::Collate 模块来实现对汉字按拼音排序。其原理是依据 Unicode 标准,先将汉字转换为对应的 Unicode 编码,然后按照 Unicode 编码来进行排序。如果两个汉字的拼音相同,则会根据 Unicode 编码进行比较。

所以,其实pinyin.pm排序没有考虑笔划顺序对吧? 有没有办法将bibmap集成到biblatex-gb7714,提供option让用户开启,感觉你的bibmap更科学。

@TomBener
Copy link

TomBener commented Mar 26, 2024

在 macOS 上,我通过替换 /private/var/folders/*/*/T/par-*/cache-*/inc/lib/Unicode/Collate/CJK/Pinyin.pm 实现了多音字的正确排序,非常感谢。

不过我还有两个小问题:

  1. 替换后的 Pinyin.pm 文件是一直有效的吗?如果 biber 更新或系统清理了缓存,替换的 Pinyin.pm 会不会失效呢?

  2. 我还尝试了添加 key 的方式,例如:

@book{shenyao1936,
  author = {沈垚},
  date = {1936},
  publisher = {商務印書館},
  location = {上海},
  title = {落帆樓文稿},
  key = {shen3yao2}
}

在我的 .bib 文件中,只有这一个条目添加了 key 字段,编译之后为什么 shenyao1936 会被排到所有中文文献的最后呢?谢谢。

@hushidong
Copy link
Owner Author

如果要用key,那么所有文献都要用key才能正确排序。

缓存一遍不太会换的。若被清理了只能重新覆盖pinyin.PM文件了。

@TomBener
Copy link

TomBener commented Apr 21, 2024

经过验证,我发现 Biber 缓存会在电脑关机后被清理。为了使用胡老师修改后的 Pinyin.pm,我用 Keyboard Maestro 制作了一个 macro,用于在 Mac 开机时自动更新 Pinyin.pm

CleanShot 2024-04-21 at 08 47 58@2x

执行的命令如下:

# Get the path of the cache folder
cache_path=$(biber --cache)

# Copy updated `Pinyin.pm` to the cache folder
cp -f ~/Documents/Pinyin.pm "${cache_path}/inc/lib/Unicode/Collate/CJK/Pinyin.pm"

其他操作系统可参考这个命令进行修改,或者用其他自动化工具实现类似的操作。关于 Biber cache 的问题,可以参考 这个回答

@hushidong
Copy link
Owner Author

不错呀,自己动手丰衣足食。

@TomBener
Copy link

TomBener commented May 10, 2024

最近遇到一个「」(kàn)姓在参考文献列表排序时不正确,我看了一下它(U+961A)在 Pinyin.pm 中的位置是正确的:

770B 884E 5D01 5888 77B0 78E1 95DE 77D9 961A
5FFC 95F6 780A 7C87 5EB7 5ADD 5D7B 6177 6F2E 69FA

但为什么排序是下图这样的呢:

CleanShot 2024-05-10 at 17 10 38@2x

以及这里 姓也应该在 姓之后。

@zepinglee
Copy link
Contributor

以及这里 姓也应该在 姓 之后。

似乎是数据有误。可以使用 https://github.com/unicode-org/cldr/blob/main/common/collation/zh.xml 的数据修正。

另外 https://github.com/unicode-org/cldr/blob/main/common/transforms/Han-Latin-Names.xml 也记录了一些姓名的多音字,但还不全,其中就没有包括“阚”。

@TomBener
Copy link

@zepinglee 谢谢,感觉确实是数据有误,不过「阚」不是一个多音字啊。

@zepinglee
Copy link
Contributor

zepinglee commented May 11, 2024

不过「阚」不是一个多音字啊。

collation/zh.xml 记录的拼音是 hǎn。

@TomBener
Copy link

TomBener commented May 11, 2024

感谢!我修改了一下 Pinyin.pm,调整了「阚」、「李」、「厉」的顺序,现在这几个姓氏可以根据拼音正确排序了。

Pinyin.pm.zip

另外推荐一下这两个网站,可以根据字符或 Unicode 编码查询对应的值:

@hushidong
Copy link
Owner Author

感谢

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants