内容仍然是我们在packt如何使用neo4j的关键聚氨酯

“内容为王,”比尔 盖茨20年前曾说过一句名言,他很快就预言,”任何拥有个人电脑和调制解调器的人都可以发布他们所能创作的任何内容。””

那么,你如何为访问者提供相关性呢?

让一系列相似的内容出现在页面的某个地方,在提高参与度方面提供了真正的价值。 这基本上是基于一条内容的推荐。

关于用户的信息越多,推荐就越好。 如果你没有特定用户的数据(冷启动),你可以用新的和受欢迎的结果来支持这个列表,这些结果更有可能激起”普通”访问者的兴趣。

集中的”中心”是指以分类和/或分级的方式组织内容,为用户提供大量相关度高的内容。 这种方法起源于印刷报纸,但后来成为出版商和内容聚合网站广泛使用的工具。

这方面的好例子可以在网站上看到,比如Reddit(由用户手动进行分类(或者网飞(关于他们的元数据生成过程已经写了很多了!).

在帕克特出版公司,我们决定同时采用这两种方式。 我们的目标是为首次发现我们的用户提供更有吸引力的体验,并提高我们现有用户群的参与度和保留率。

这也不仅仅是产品:我们有大量免费提供的技术博客、社论、教程和摘录可供分类。 六个月前,我们开始认识到上述形式的内容链接的好处。 用户参与度和满意度的好处是显而易见的,但实现这一目标的方法却不是。

这篇文章的其余部分是关于我们如何处理这个问题的,这个问题已经表现为我们的技术页面中心。

实现内容的分类和推荐依赖于将准确的元数据附加到所有内容上。 如果您没有一个在发布时生成元数据的可靠策略,手动标记所有内容可能是一个资源密集型的过程,并且容易出现人为错误。

这就是我们踏上旅程时所处的位置。 我们的类别级元数据通常过于宽泛,无法真正为我们的用户提供相关性,而关键字级元数据非常狭窄,往往不正确或根本无法使用。

有人提出,要有效、大规模地做到这一点,我们需要一个自动化的解决方案。

简而言之,这个问题的任何自动化解决方案都将从一些表示紧密相关主题之间关系的术语语料库开始。 然后对每一条内容进行扫描,寻找那些主题的提及,并进行适当的标记。 完成后,您只需决定构成您的类别的主题,并决定在这些主题中呈现内容的层次结构。

出于多种原因,图形数据库是思考这个问题的自然方式。 通过图表结构,您可以将信息的任意轴表示为节点,并将这些轴之间的多面关系表示为边。

分析节点之间的联系变成了定义遍历的一件小事,你永远不会被限制只考虑一个维度。 此外,图形数据库模式的可扩展性意味着您可以以非常有效的方式添加新的信息维度。 您可以快速原型化和测试模式的新部分,并轻松分析影响。

出于几个原因,我们选择在这个项目中使用Neo4j,其中最重要的两个原因是:

    • 查询语言: 密码是探索图形数据的一种直观和表达方式
    • 性能: 直到今天,我经常惊讶于我们执行非常复杂的查询的速度,以及这些查询对巨大数据集的可伸缩性

我们首先需要的是一个特定领域的主题语料库,其中包含一些主题之间关系的概念。 对我们来说幸运的是,已经存在一个广泛的、适度的和广泛使用的语料库:StackOverflow .com标签。

堆栈溢出是一个问答网站,供寻找各种软件问题答案的开发人员使用。 网站上的问题用一个或多个标签来标记,这些标签定义了问题涉及的主题。

这为潜在的提问者和希望分享他们专业知识的专家社区提供了极好的搜索。 标签由社区控制,并根据一致性和有用性进行调节。

也有一种自然的方式将这些话题联系起来。 当两个标签被标记在同一个问题上时,这种共现告诉我们这两个主题在某种程度上是相互关联的(例如g.,对于“neo4j”标签,最常见的共现标签是“cypher”、“java”和图形数据库). 这些关系通过堆栈交换应用编程接口聚合并可用,使得以图形形式生成整个主题网络变得微不足道。

通过观察节点和边的大小,我们可以对这个领域做出更多的推断。 如果两个标签的共现占标签A问题的90%,但只占标签B问题的10%,我们可以推断方向性,并开始建立层次和社区。

我们使用应用编程接口将所有堆栈溢出标记作为节点放入我们的图中,并将它们的共现作为边:

内容仍然是我们在packt如何使用neo4j的关键聚氨酯

堆栈溢出图的一个小摘录

下一步是将图中的所有内容表示为节点,并将所有提到的堆栈溢出标记表示为边。 我为此尝试了许多不同的包和解决方案,现在,我已经决定使用大蟒中的好的旧正则表达式。 堆栈溢出还为一些标签提供了有节制的同义实时同步数据库 词列表,允许我们捕获更多的信息。

对于第一遍,我们只使用立即可用的副本。 对于产品,这是网站上的副本(已经是关键词密集的摘要),对于文章,这意味着文章的全部内容。 最初,我们通过将原始术语频率放在边缘来量化关系。

就这样,我们所有的内容都附有特定领域的标签。 我们可以立即开始遍历,看看事物是如何联系在一起的:

内容仍然是我们在packt如何使用neo4j的关键聚氨酯

围绕我们流行的《学习新4j)一书的本地网络的子图

从目前的情况来看,我们可以立即开始进行产品推荐,并考虑如何对我们的内容进行分类。 然而,仍然有一些碎片丢失。

首先,为我们图表中的所有标签生成类别页面是没有意义的。 标签为我们的分类提供了基础,但是我们仍然需要一个更干净、更有层次的网络来定义特定的感兴趣的领域。 为此,我们实现了一个 位于堆栈溢出标签网络旁边的节点。 这允许我们通过对堆栈溢出网络中的潜在连接进行分类来扩展本体。

内容仍然是我们在packt如何使用neo4j的关键聚氨酯

堆栈溢出网络旁边的本体演示

这为我们提供了我们想要的高层次的分类,从那里,定义将内容与主题联系起来的逻辑是一个问题。

其次,标签频率是众所周知的不良信息度量标准。 我们需要从 边缘到 边缘。 为此,我们转向tf-idf和主题大小等指标,以及中心性等图论度量。 这让我们对我们的内容有了更细致的了解。

最后,在推荐方面,我们有内容过滤,但我们还没有添加协作过滤。 我们仍然将我们的关系建立在堆栈溢出所认为的相互关联的基础上,而不是我们实际客户的使用模式。

一旦我们有了所有这些东西,我们就可以生成我们的分类页面了。

我们的图表位于一个网络服务后面,每当一个技术页面被渲染时,这个服务就会被调用。 网服务会调用一组特定的Cypher查询,并按照页面设计所定义的各种块形式返回内容编号列表。
这种方法使我们在许多关键领域具有灵活性。

这种方法使我们在许多关键领域具有灵活性。
这意味着动态建议的所有繁重工作均由图形而非CMS完成。

这意味着动态建议的所有繁重工作均由图形而非内容管理系统完成。
这样做的好处是,例如,如果我们决定以Python编写有关机器学习的文章,则该文章将自动出现在“机器学习”页面,Python页面和“数据科学”页面上。

如果我们愿意,我们可以为每个堆栈溢出标签创建一个类别页面。

编辑者还可以控制”精选”内容,因此我们可以突出某些作品。
技术页面的可扩展性仅受我们内容的规模限制,而不受我们实施的技术的限制; 这是一个很棒的地方。

技术页面很好地展示了图表的灵活性如何实现非常动态的分类,但是这个故事还有很多,还有很多问题尚待解答。

这样做的好处是,例如,如果我们决定以大蟒编写有关机器学习的文章,则该文章将自动出现在”机器学习”页面,蟒蛇页面和”数据科学”页面上。