真正的 Web 2.0: Wikipedia 家族

通过不是很有名气的 Wikimedia 项目成果丰富 Web 站点

您一定听说过 Wikipedia (维基百科全书),但是您是否知道还有一些与 Wikipedia 相关的站点,它们可以提供同样有价值的由用户生成的内容?大量隶属于 Wikipedia 的相关站点对 Web 开发人员非常有用。了解如何通过 Wikipedia 以外的资源丰富您的信息空间,包括应用这些站点的数据的小部件示例。

Uche Ogbuji, 合作伙伴, Zepheira, LLC

Uche OgbujiUche Ogbuji 是 Zepheira, LLC 的合伙人,这家公司专门提供下一代 Web 技术解决方案。Ogbuji 是 4Suite 的首席开发人员,这是一种用于 XML、RDF 和知识管理应用程序的开放源代码平台;也是 Versa RDF 查询语言的首席开发人员。他是一位出生在尼日利亚的计算机工程师和技术作家,目前定居在科罗拉多的博尔德。可以通过他的 Weblog Copia 进一步了解 Ogbuji 先生。



2008 年 12 月 09 日

Wikipedia 一直被认为是最流行的和最知名的 Web 站点之一。从想要完成家庭作业的学生,到希望利用用户生成内容的 Web 开发人员等等,都可以通过 Wikipedia 满足需求。但是就提供有用信息而言,Wikipedia 仅仅是一个更庞大资源的一部分。Wikimedia Foundation (维基媒体基金会)组织不仅运营 Wikipedia,并且还运行很多其他站点。它在主页中这样声明:“想像这样一个世界,它让每个人都可以自由分享所有的知识。这就是我们的承诺。”这是一个伟大的宣言,它不是一个庞大的百科全书就可以实现的。您可能已经了解到 Wikipedia 拥有大量不同语言的版本。(令我感到吃惊和欣慰的是,我发现了大量有关 Igbo 语的 Wikipedia 文章,这是我的母语)。但是您是否知道多长时间才会出现使用其他语言表示的有用信息(未翻译为英语)?您以前是否听说过 Wiktionary、Wikinews、Wikibooks、Wikisource、Wikiversity 以及类似内容?您是否知道可以通过利用这个庞大的信息源为您的 Web 项目获得一些好处?我将在本文中向您展示更优秀的 Wikimedia,并给出一些代码帮助您的站点的用户 “自由地分享所有知识”。

站点

下面将简单介绍除知名的 Wikipedia 以外,Wikipedia 家族中涵盖的其他一些站点。

Wiktionary

Wiktionary 是与 Wikipedia 相对应的字典站点。很多人对这个开放内容的百科全书的实用性表示怀疑,并且不受关注的字典编纂工作似乎是一项更加艰难的任务。在 “有效” 条目的数量方面,法语版本的站点规模最大,紧随其后的是英语版本的站点,后者拥有目前为止最全面的条目和编辑。排在第三位的土耳其语版本与前两者差距比较大,但是有 9 个语言版本的站点至少具有 1000,000 个 “有效条目”,大量其他语言版本也接近这个规模,这些站点联合起来就形成了一个令人吃惊的规模。其中一些站点通过使用自动程序从一些免费的信息源导入条目来进行扩展。例如 French Wiktionary,它包括大量来自 Dictionnaire de l'Académie française 这种旧式的、免费的字典的条目。很多 Wiktionary 条目包括到其他语言的翻译,因此另一个特性就是大量导入其他语言版本中列出的翻译。条目类型众多,从无实际内容的存根(尤其是那些没有被分类为 “有效” 条目的内容),到包含丰富内容的条目,比如词源、用例、发音(包含音标字母和声音文件)、交叉参考、不同语法形式、翻译,甚至包含对重要文本(例如 Project Gutenberg)的外形分析。

Wikinews

Wikinews 是获得有关新闻和时事文章的站点,它的理念是具有某些知识或参与某些事件的人士可以帮助填充相关页面的内容。其原则是必须秉持中立的观点撰写文章。Wikinews 可以包含新闻报道、多媒体报道、采访等内容。随后出现了 Wikimedia Radio,并最终发展为一个固定的流式音频广播站点,包括各种节目和新闻,并且这些内容大部分来自 Wikinews 和其他 Wikimedia 项目。通常,Wikinews 覆盖范围往往倾向于那些拥有大量贡献者的地区和主题,这限制站点本身发展为综合性站点。此外,Wikipedia 的流行意味着它经常及时地更新站点的文章,甚至按照匹配新闻报道的速度进行更新,因为它经常从 Wikinews 项目获得内容。

Wikibooks 和 Wikiversity

对百科全书文章进行的最大扩展就是将它的主题变成一本完整的书籍,而这正是 Wikibooks 的领域。它包含了 Wikijunior,一个面向儿童和儿童教育的文本集合,它可能很快将成为独立的完整项目。Wikiversity 曾经也是 Wikibooks 的一部分,它成为了一个完整的 Wikimedia 站点。Wikiversity 鼓励以小组或社区的方式进行学习,参与者编辑学习项目页面并进行有助于理解的实践。它被编排成各种学科,主要侧重于所有结合了教科书的支持资源。Wikibooks 托管教科书并且还支持协作式社区开发,Wiki 页面将扩充后的零碎内容并入到完整的书籍中。书籍和学科涵盖了各种内容,包括学习语言、计算机科学、有机化学和法律等。从事生物科学的教育者还应关注 Wikispecies,这是一个有关生命形式的分类字典,类似于一个有关生物学的、具有适当结构的 Wikipedia。

Wikisource

Wikisource(也称为 The Free Library)将所有这些二次信息处理为原始文档,用于收集源文本、注释、翻译和辅助材料。文本可以是小说或非小说作品、历史记载、公共文档或任何重要的并且不受版权限制的内容。

Wikiquote

Wikiquote 是一个开放的参考资料站点,包括各种语言的引用自历史和文化方面的语录。对于 Wikiquote 最近存在争议,一些人考虑到内容的合适性和版权侵犯,认为应该撤销这个网站。有人认为应该将语录添加到 Wikisource 中。然而,还有很多人认为如果 Wikisource 存在任何内容问题,社区在采取关闭 wiki 这种过激举措之前,首先应该尝试解决这些问题。当然,这种行为在短时间内是不可能发生的。

Wikimedia Commons

Wikimedia Commons 是 Wikimedia 家族的姊妹站点,托管图像、视频、音频和其他任何免费的媒体文件。它是一个非常大型的资源库,包含数百万个文件。它的目标是成为这类媒体文件的文化资源库,并试图通过对重要的图像进行分类和认定进一步实现这个目标。

Wikimedia 的作用

Wikimedia 空间的行为的广度和高度为相互交流和 Wikimedia 以外的有用应用程序提供了众多机遇。这就是 Web 2.0 的精髓。用户可以获取目前尚未集成的开放数据流,并超越原始发布者的最初意图,将它们转换为全新的应用程序。

Google 自定义搜索部件

目前,有关如何跨各种 Wikimedia 属性进行搜索并不明确。一些独立的项目提供了一种聚合搜索,但是其实用性分为多个级别,因此,完全有理由实现自己的搜索。Google 的其中一个计划 Google Co-op 提供了一个自定义搜索引擎(CSE)工具,它允许您根据自己的规范定义并创建搜索工具,甚至可以通过详细的注释维护。我创建了一个自定义搜索 “Wikimedia plus”,包含了所有受支持的语言,以及其他一些有趣的相关站点。清单 1 显示了搜索的主要条件。

清单 1. 自定义搜索条件
*.wikipedia.org/*
*.wiktionary.org/*
*.wikibooks.org/*
*.wikiversity.org/*
*.wikinews.org/*
*.wikimedia.org/*
*.wikiquote.org/*
*.wikisource.org/*
*.wikia.com/*
*.uncyclopedia.org/*

注意通配符形式,这是 CSE 的特性之一。Google 为 CSE 提供了一个小部件表单。清单 2 展示了用例。

清单 2. “Wikimedia plus” 搜索引擎部件的用法示例
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" >
<head>
<title>Hello Wikimedia world</title>
</head>
<body>
<p>Use the following gadget to search Wikimedia and selected Wikia sites.</p>
<hr/>
<!-- Remove line breaks in the following script element before using -->
<script src="http://www.gmodules.com/ig/ifr?url=
http://www.google.com/coop/api/016404950850373629424/cse/1bius8lhc7g/gadget
&amp;synd=open&amp;w=320&amp;h=75&amp;title=Wikimedia+plus
&amp;border=%23ffffff%7C3px%2C1px+solid+%23999999&amp;output=js"></script>
</body>
</html>

为了进行格式化,我将 Google 的长 URL 分解为多个行。在试用或修改该清单前,只需删除 script 元素中的换行符。图 1 展示了结果页面的截图。Google 的 JavaScript 使用包含搜索表单的 iframe 替换了该元素。当输入搜索时,将在一个独立的窗口打开结果页面。

图 1. 使用 Google Wikimedia plus 部件的示例页面
使用 Google Wikimedia plus 部件的示例页面

Word of the day 部件

在第二个示例中,我将展示如何使用 Wiktionary 中的 word-of-the-day 提要创建自己的小部件。编辑每天都要使用一个有趣的词作为当天的特色内容。这个小部件将选中的词与该词在 Wikimedia commons 上的搜索结果(图像、声音文件、视频等等)结合在一起。清单 3(wotd.js)展示了部件的 JavaScript 代码。

清单 3(wotd.js)JavaScript word-of-the-day 小部件
/*

Word of the day widget code.



Requires jQuery: http://www.jquery.com (tested with version 1.2.6)

*/



var wotd = 

{

//Some variavles global to the wotd namespace

wotdfeedurl: "wotd_feed_proxy",

commonssearch: "commons_search_proxy/",

commonsbase: "http://commons.wikimedia.org",

mediatargetid: "target",

wotdtargetid: "wotd",



word: "",

worddesc: "",

wiktionarylink: "",



//Invoked once the main HTML DOM is ready

loadPage: function()

{

wotd.medianode = $("#" + wotd.mediatargetid);

wotd.wotdnode = $("#" + wotd.wotdtargetid);

$.get(wotd.wotdfeedurl, wotd.processFeed);

},



//Invoked with the result of the AJAX call to the Wiktionary feed

processFeed: function(feed)

{

var item = $("item:first", feed);

var title = item.find("title").text();

wotd.word = title.substring(title.indexOf(':')+2);

wotd.wikionarylink = item.find("link").text();



//Update the target spot on the main page with the word of the day link

wotd.wotdnode.append(wotd.word);

wotd.wotdnode.attr("href", wotd.wikionarylink);



$.get(wotd.commonssearch + wotd.word, wotd.processSearch);

},



//Invoked with the result of the AJAX call to the Wikimedia commons search

processSearch: function(result)

{

//Narrow in on the search results page

narrowed = $(result).find(".mw-search-results");

//Fix up relative link and image URLs

narrowed.find("a, link").attr("href", function (arr) {

return wotd.commonsbase + $(this).attr("href");

});

narrowed.find("img").attr("src", function (arr) {

return wotd.commonsbase + $(this).attr("src");

});

//Update the target spot on the main page with the search results

narrowed.find("table td a").each(function (){

$('<div></div>').html($(this)).appendTo(wotd.medianode);

})        

},

}



$(document).ready(function()

{

wotd.loadPage();

});

这段代码进行了良好的注释。它对 Ajax 库使用了 jQuery 库,并处理结果页面。像这类部件还必须有一个服务器端组件,因为安全性限制将阻止您在域之间发出 Ajax 请求。JavaScript 调用了一个相关的 URL wotd_feed_proxy,这实际上是远程 Wikimedia 站点页面的代理。这是使用所选的服务器工具可以实现的一个常见模式。我使用清单 4(wotd_server.py)所示的 Python/CherryPy 服务器代码。

清单 4(wotd_server.py)word-of-the-day 部件的 Python/CherryPy 服务器代码
# encoding: utf-8
"""
wotd_server.py

Requires: CherryPy http://cherrypy.py"""

import os
import urllib2
import cherrypy

#Wikimedia commons search doesn't like bots, so pretend to be a browser
HEADERS = { 'User-Agent' : 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)' }

#Tell the server where to find local, static files such as index.html
LOCAL_DIR = os.path.join(os.getcwd(), os.path.dirname(__file__))

#The URLs to be proxied
WOTD_FEED_URL = "http://toolserver.org/~cmackenzie/wotd-rss.php"
COMMONS_SEARCH_BASE = "http://commons.wikimedia.org/wiki/Special:Search?search="

#The server code class
class Wotd:
#Set up a local, static file server
default = cherrypy.tools.staticdir.handler(
section="/", dir=LOCAL_DIR)
#Proxy the Wiktionary feed
_cnnew1@cherrypy.expose
def wotd_feed_proxy(self):
cherrypy.response.headers['Content-Type'] = 'text/xml'
return urllib2.urlopen(WOTD_FEED_URL).read()
#Proxy Wikimedia commons search
@cherrypy.expose
def commons_search_proxy(self, word):
url = COMMONS_SEARCH_BASE + word
req = urllib2.Request(url, None, HEADERS)
response = urllib2.urlopen(req)
cherrypy.response.headers['Content-Type'] = 'text/html'
return response.read()

#Launch the server
cherrypy.server.socket_port = 8888
cherrypy.server.socket_host = 'localhost'
cherrypy.quickstart(Wotd())

同样,这些代码也进行了良好的注释。清单 5(index.html)是小部件的示例托管页面。

清单 5(index.html)word-of-the-day 小部件的示例托管页面
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" >
<head>
<title>Wikimedia word of the day</title>
<script src="jquery-1.2.6.js" type="text/javascript"></script>
<script src="json2.js" type="text/javascript"></script>
<script src="wotd.js" type="text/javascript"></script>
</head>
<body>
<p>Wiktionary word of the day: <a id="wotd"></a></p>
<p>Related items on Wikimedia commons:</p>
<div id="target"></div>
</body>
</html>
图 2. 使用 word-of-the-day 小部件的示例页面
使用 word-of-the-day 小部件的示例页面

结束语

如果您对这些站点中的技术和组织感兴趣,可以访问 Meta-Wiki,这是 “一个致力于协调和归档 Wikimedia Foundation 的项目及其相关事务的网站”。Wikimedia Foundation 是一个非盈利性组织,但它的类似开放信息目标启发了商业公司(通常称为商业 Wiki farms)。规模最大的此类商业站点是 Wikia,它的一名创始人还是 Wikimedia 共同创始人之一。该站点托管了大量可能不适合 Wikimedia 站点的主题(例如各种 Uncyclopedia,它对实际的主题进行了虚构的描述)。Wikileaks 是一个针对激进主义者,举报者和其他想要匿名发布政府、企业或其他组织希望保密的机密文档的人员的 wiki。由于涉及敏感性话题,因此 Wikileaks 不属于传统意义上的 wiki,在发布之前需要在内部进行审核。

由于在 Wikimedia 站点中使用了 Creative Commons Attribution 许可(知识共享许可),您可以免费使用所有这些资料,甚至可以用于商业活动,惟一的要求是必须添加返回链接并清晰地说明来源归属。Wikimedia 的目标令人瞩目,其实现过程也是如此。具有创造力的网络管理员需要处理大量的信息。

参考资料

学习

  • 您可以参阅本文在 developerWorks 全球网站上的 英文原文
  • 了解有关 Wikimedia Foundation 的更多信息,该组织 “运营世界上最大的一些协作编辑参考项目,包括 Wikipedia,它是全球十大访问量最高的网站之一”。Wikimedia 博客包含了有关所有这些站点的有用信息和重要事件。如果对技术平台和社区组织更感兴趣,请通过 Meta-Wiki 进一步了解。
  • Wiktionary 是一个涉及 172 种语言的全面的字典站点。
  • Wikibooks 是一个免费教科书和注释文本集合,任何人都可以进行编辑。Wikiversity 以此为基础进行构建,可以支持学习社区、学习资料和结果行为。
  • Wikinews 是一个内容开放的协作站点,发布有关新闻和时事的文章。
  • Wikispecies 是一个有关生命形式的分类目录。
  • Wikisource 是一个源文本资源库,包括注释、翻译和辅助材料。
  • 要获得有关 jQuery 的出色介绍,请阅读 Jesse Skinner 撰写的 “使用 jQuery 简化 Ajax 开发”。
  • 查看由本文作者创建的 Google 自定义搜索 Wikimedia plus
  • Wikia 是一个商业组织,它是托管各种公开信息的公共 wiki,使用与 Wikimedia 站点相同的 MediaWiki 技术。Wikia 的最流行站点之一是 Uncyclopedia
  • Wikileaks 是一个发布匿名信息和敏感文档的站点,支持激进主义者和举报者。
  • 通过 developerWorks 文章 “真正的 Web 2.0:掌握知识共享许可”,了解有关 Creative Commons 的更多内容。
  • 查看 “真正的 Web 2.0 系列专栏”,此专栏文章将深入研究实际的 Web 2.0 站点,并演示 Web 架构师如何将 Web 中的最佳内容引入他们自己的网站。
  • 阅读 developerWorks Web 开发专区 中有关 Web 技术的文章和教程,包括本专栏早期文章,提高您的站点开发技能。
  • 随时关注 developerWorks 技术活动和网络广播

获得产品和技术

  • Wikimedia 站点使用开源的 MediaWiki 实现,您可以使用它托管自己的 wiki。
  • jQuery 是一个出色的 JavaScript 库,其中提供了 Ajax 特性。

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Web development
ArticleID=357745
ArticleTitle=真正的 Web 2.0: Wikipedia 家族
publish-date=12092008