如何规范化/规范化名人列表?



我有一个文本文件,其中包含从不同来源编译的著名名称列表,我想对其进行规范化,以便我可以准确地整理它们。例如,该列表包括老子、老子和老子等变体;但是,所有这些最终都代表了老子。我有哪些选项可以规范化/规范化名称?

我注意到的一件事是,如果你尝试将这些变体直接放入维基百科URL,它们最终都会重定向到同一页面(老子,老子,老子(。是否有维基数据API来查询这些重定向,或者是否有一种简单的方法可以从重定向行为中捕获规范术语?

在老子项 https://www.wikidata.org/wiki/Q9333 上有"也称为"的列表,这些是skos:altLabel,称为别名。您可以像这样查询"老子":

SELECT DISTINCT ?s ?sLabel ?sAltLabel WHERE {
?s wdt:P31 wd:Q5.
OPTIONAL { ?s skos:altLabel ?sAltLabel. }
FILTER(CONTAINS(?sAltLabel, "Lao Tzu"@en)) 
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
} limit 100 

当我在 https://query.wikidata.org/运行它时,我得到了一个超时异常。 所以我加上了?s wdt:P106 wd:Q4964182.(职业哲学家(。(如果时间异常,脚本中的查询可能不会退出(。

另外,请参阅此处:https://www.wikidata.org/wiki/Help:Aliases 写

"多个项目可以具有相同的别名,只要它们具有不同的描述。

所以这也应该考虑。

您可以在此表单中使用其中一个MediaWiki API。

https://en.wikipedia.org/w/api.php?action=query&titles=Laozi&prop=redirects

它在实际使用中有一些明显的缺陷,其中一些在实际尝试时返回的页面中提到。

我最近还发现,你可以通过以下方式使用Python来练习API。

from mwclient.client import Site
from mwclient.page import Page
site = Site('en.wikipedia.org')
result = site.api('query', titles='Laozi', prop='redirects', rdlimit=10)
for value in result['query']['pages']:
for item in result['query']['pages'][value]['redirects']:
print (item['title'])

前十个重定向是:

Lao tzu
Lao tse
Lao zi
Lao Tse
Li Er
Lao-Tzu
Lao Tze
Lao-tze
Lao-tzu
Lao Tsze

但是,似乎还有更多。请注意,我可能错了。

我最终使用curl获取每个条目的维基百科页面和pup来抓取生成的页面标题,从而使用了一个足够好/快速而肮脏的解决方案:

cat NAMES.txt | xargs -I % -d"n" sh -c 'curl -s "https://en.wikipedia.org/w/index.php" --data-urlencode "title=%" | pup -p "#firstHeading text{}"' > NAMES.canonicalized.txt

最新更新