
原文towardsdatascience.com/the-secret-network-of-owls-d55e7b2c4910你知道 8 月 4 日是国际猫头鹰意识日吗我也不知道直到无聊地浏览可爱的猫头鹰表情包这让我来到了这个网站。然后正如我们最近在我们的花园里发现了一窝可爱的猫头鹰我想在维基百科上查看它们——结果令人震惊地看到维基上有254 种猫头鹰被记录这是我们最喜欢的免费开放获取的知识来源。唯一合理的下一步是将这些资料转化为数据可视化以便更好地理解国际猫头鹰景观。也就是说我将自动下载猫头鹰物种的完整列表以及它们的维基百科资料。然后我将使用文本匹配和网络 X 图分析库来提取猫头鹰物种的相似性网络然后进行可视化。这样我们将有一个猫头鹰物种的视觉表示这使得解释不同物种之间的关系变得容易得多。此外虽然这里讨论的猫头鹰主题是及时的但方法和步骤可以轻松地适应我们想要涵盖的任何其他主题并将其转化为依赖于公开可用的维基百科数据库的知识图。所有图像均由作者创建。1. 收集猫头鹰物种列表第一步是快速收集所有列出的猫头鹰物种的名称这些名称被整洁地上传到维基百科上的这个表格中https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/f7a75b79e1d4e2c8972c2ae522cf6a63.png来源en.wikipedia.org/wiki/List_of_owl_species为了获取这个表格的内容我首先使用请求库下载了 HTML 源代码然后快速使用Beautiful Soup提取了所有相关信息如下所示。正如代码单元格的输出所示我能够获取到所有 254 种猫头鹰的名称。# import the necessary librariesfromurllib.requestimporturlopenimportbs4asbs# take the url from wikipediaurlhttps://en.wikipedia.org/wiki/List_of_owl_species# download and parse the html sourcesauceurlopen(url).read()soupbs.BeautifulSoup(sauce,lxml)# extract the owl names from the relevant tags within the table# note: the td tags will also contain the binomial names, which I# managed to filter out by simply dropping all elements which as any# year-looking objects in it (since no owl species were discoverd in the 2000s,# filtering for 1 is just enough)tagssoup.find_all(td)tags[tfortintagsifhrefinstr(t)]owls[]fortintags:if1notint.text:owls.append(t.text)len(owls)这个单元格应该输出包含所有猫头鹰名称的列表长度为 254。注意在这里我只提取了它们的普通名称因为正如你将在下一节中看到的这已经足够下载它们的维基百科资料。2. 下载每种猫头鹰物种的维基百科资料现在我们已经拥有了猫头鹰物种的完整列表每种都由它们的普通名称描述让我们使用Wikipedia API下载它们的资料页面并将它们的文本内容保存以供以后使用。让我们开始设置并执行一个示例查询# importing the apiimportwikipediaapi# setting up the api connectionwiki_wikiwikipediaapi.Wikipedia(owl-miniproject)# preparing a folder to save our colleted dataimportos folderoutwiki_page_contentifnotos.path.exists(folderout):os.makedirs(folderout)# a test samplepagewiki_wiki.page(Greater sooty owl)page.text[0:1000]输出是大型烟灰猫头鹰资料页面的前 1000 个字符https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/a05853177e0d601715a06b305316c233.png为了比较你还可以在维基百科上找到这个https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/46e1f47dc651101c6a3959f39efd956c.png来源en.wikipedia.org/wiki/Greater_sooty_owl现在让我们下载所有资料foridx,owlinenumerate(owls):ifidx%100:print(idx)ifnotos.path.exists(folderout/owl):pagewiki_wiki.page(owl)foutopen(folderout/owl,w)fout.write(page.text)fout.close()这将产生 254 个文本文件每个文件都包含相应猫头鹰物种的完整文本资料。现在在最后一节让我们将其转换为图。3. 构建猫头鹰网络在这里首先我们将解析之前下载的包含猫头鹰资料的文本数据。然后在两个 for 循环中我们以成对的方式比较每种猫头鹰物种并计算它们的相似度即我们图中的连接强度通过两种物种资料之间的交叉引用总数。这受到第一种物种在第二种物种资料中提及的次数以及相反情况的影响。为了构建图我们使用NetworkX。# lets store the textual profile of each owl in the following dictionarynames_texts{}fornamein[fforfinos.listdir(folderout)if.DSnotinf]:withopen(folderout/name)asmyfile:names_texts[name]myfile.read().split(External links)[0]# import networkx as create an empty graph objectimportnetworkxasnx Gnx.Graph()# now build the graph by pair-wise comparing each owl profileedges{}forname1,text1innames_texts.items():forname2,text2innames_texts.items():ifname1!name2:weighttext1.count(name2)text2.count(name1)ifweight0:G.add_edge(name1,name2,weightweight)# finally, lets show the size of the graph we builtprint(G.number_of_nodes(),G.number_of_edges())接下来我使用了 Matplotlib 和 NetworkX 来快速可视化这个图importmatplotlib.pyplotasplt# Define the node size proportional to the node degreenode_sizes[100*nx.degree(G,node)fornodeinG.nodes()]# Define the edge width proportional to the edge weightedge_widths[G[u][v][weight]foru,vinG.edges()]# Get positions for the nodes using a force layoutposnx.spring_layout(G,k0.6)# Draw the nodes with labelsf,axplt.subplots(1,1,figsize(10,10))nx.draw_networkx_nodes(G,pos,node_sizenode_sizes,node_colorlightblue,axax)nx.draw_networkx_labels(G,pos,font_size5,axax)# Draw the edges with widths proportional to the weightsnx.draw_networkx_edges(G,pos,widthedge_widths,axax)ax.axis(off)https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/a91c2550998c2d4a56b16d8cbb8f31c7.png然而由于这个图是在 Python 中绘制的只需几行代码所以这个图相当混乱所以我再次尝试并在Gephi如何做到这一点的教程即将推出中可视化它。结果如下https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/77086e53aa63e084164a9f33505f27f9.png我们得到的图在揭示这些伟大的猫头鹰物种如何形成更大的群体方面实际上非常有趣和有揭示性——即使我们是鸟类学家。最大的一个以欧洲鹰鸮为中心主要包含生活在欧洲和亚洲的物种。我们可能还会看到另一个包含各种鸮鸟的大集群——结果证明鸮鸟是小型到中型的猫头鹰。我们还看到一个独立的图组件包含各种袋鼠鸮它们是澳大利亚和新西兰的栖息地猫头鹰而右下角的网络集群主要包含在森林中常见的矮小猫头鹰从热带雨林到干旱森林和山区。虽然通过进行这次快速的知识图谱分析我当然没有成为猫头鹰专家。然而我确实比以前学到了更多关于猫头鹰的知识。这也突显了网络分析和知识图谱在如何快速探索任何领域从科学到艺术从商业到人力资源方面的力量通过结合数据处理和可视化并为更高级的分析步骤以及领域专家合作开辟空间。