如何规范化/规范化名人名单?

时间:2017-07-20 17:49:36

标签: scripting normalization wikipedia wikidata canonicalization

我有一个文本文件,其中包含从不同来源编译的着名名称列表,我希望将其标准化,以便我可以准确地整理它们。例如,该列表包括诸如老子,老子和老子等变体;但是,所有这些最终代表Laozi。我可以选择标准化/规范化名称吗?

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

3 个答案:

答案 0 :(得分:1)

在老子项目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写的是

  

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

所以这也应该考虑。

答案 1 :(得分:1)

您可以使用此表单中的某个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

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

答案 2 :(得分:0)

我最终使用curl来获取每个条目的Wikipedia页面并使用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