如何normalize/canonicalize列出名人名单?
How to normalize/canonicalize a list of famous names?
我有一个文本文件,其中包含从不同来源编译的著名名字列表,我想对其进行规范化,以便我可以准确地整理它们。例如,该列表包括老子、老子和老子等变体;但是,所有这些最终都代表 Laozi。 normalize/canonicalize 我有哪些选择?
我注意到的一件事是,如果您尝试将这些变体直接放入维基百科 URL,它们最终都会重定向到同一页面 (Lao-tse, Lao Tzu, Lao Zi)。是否有维基数据 API 可以查询这些重定向,或者是否有一种简单的方法可以从重定向行为中捕获规范术语?
在老子项目 https://www.wikidata.org/wiki/Q9333 上有 "also known as" 的列表,它们是 skos:altLabel
并且被称为别名。例如,您可以这样查询 "Lao Tzu":
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写着
"Multiple items can have the same alias, so long as they have different descriptions."
所以这个也要考虑。
您可以在此表单中使用其中一个 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
不过,好像还有不少。请注意,我对此可能是错误的。
我最终采用了 good-enough/quick-and-dirty 解决方案,使用 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
我有一个文本文件,其中包含从不同来源编译的著名名字列表,我想对其进行规范化,以便我可以准确地整理它们。例如,该列表包括老子、老子和老子等变体;但是,所有这些最终都代表 Laozi。 normalize/canonicalize 我有哪些选择?
我注意到的一件事是,如果您尝试将这些变体直接放入维基百科 URL,它们最终都会重定向到同一页面 (Lao-tse, Lao Tzu, Lao Zi)。是否有维基数据 API 可以查询这些重定向,或者是否有一种简单的方法可以从重定向行为中捕获规范术语?
在老子项目 https://www.wikidata.org/wiki/Q9333 上有 "also known as" 的列表,它们是 skos:altLabel
并且被称为别名。例如,您可以这样查询 "Lao Tzu":
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写着
"Multiple items can have the same alias, so long as they have different descriptions."
所以这个也要考虑。
您可以在此表单中使用其中一个 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
不过,好像还有不少。请注意,我对此可能是错误的。
我最终采用了 good-enough/quick-and-dirty 解决方案,使用 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