【问题标题】:visualize genres of movies可视化电影类型
【发布时间】:2015-07-06 08:33:15
【问题描述】:

使用下面的示例表,我想展示:

  • a) 节点:有很多电影以“动作”或“戏剧”作为类型
  • b) 边缘(无方向性):当电影将“戏剧”作为流派时,很可能该电影也具有“动作”流派

我的主要问题:我怎样才能最好地创建一个包含所有连接类型的所有边的列表?

假设我有一张包含电影和类型的表格:

GENRE       | MOVIE
--------------------------
Drama       | A
Action      | A
Comedy      | A

Documentary | B
Romantic    | B
Action      | B
Drama       | B

Drama       | C
Romantic    | C
Action      | C
---------------------------

我对可视化框架没有偏好,但以下内容接近我的想法: http://visjs.org/examples/network/09_sizing.html

欢迎提出其他可视化建议!

根据我的电影示例,节点和边可能如下所示: http://jsfiddle.net/wivaku/90oef0pg/

在此示例中,边缘是硬编码的。在现实生活中,我想动态地创建它们。 如何最好地使用 PHP 创建边缘 JSON?

我目前拥有的PHP sn-p:

<?php
//the SQL rows (normally from SQL, now static):
$rows = json_decode('[["Drama","A"],["Action","A"],["Comedy","A"],["Documentary","B"],["Romantic","B"],["Action","B"],["Drama","B"],["Drama","C"],["Romantic","C"],["Action","C"]]');

$nodes = array();
$edges = array();

// create nodes
$genres = array_count_values(array_map(function($i) {return $i[0]; }, $rows));
foreach ($genres as $key => $value) {
    $nodes[] = array("id"=>$key, "value"=>$value);
}

// create edges
// helpful to have genres grouped by movie? (normally from SQL, now static)
$movieGenres = json_decode('[{"movie":"A","genres":["Drama","Action","Comedy"]},{"movie":"B","genres":["Documentary","Romantic","Action","Drama"]},{"movie":"C","genres":["Drama","Romantic","Action"]}]');
// ...

print json_encode(["nodes"=>$nodes, "edges"=>$edges], JSON_NUMERIC_CHECK);
?>

提前致谢!

更新:关于 SQL 细节/选项的 cmets。我的表几乎和列出的一样。所以:genreId 和 contentId。 我正在探索的一个选项(作为 PHP 代码的快捷方式):连接每部电影的流派。

SELECT GROUP_CONCAT(genreId SEPARATOR "|") AS genres
FROM contentGenres
GROUP BY contentId
ORDER BY count(genreId) DESC

带有示例数据:

Drama|Action|Comedy
Documentary|Romantic|Action|Drama
Drama|Romantic|Action

或使用流派 ID:

1|2|3
4|5|2|1
1|5|2

我的真实数据集的结果是 ±11000 行,有些电影有 8 种类型。

【问题讨论】:

  • 那是一张真正的桌子吗?如果是这样,那么它需要规范化
  • 不,这不是一张真正的桌子,只是一个例子。
  • @Wivku:所以你想计算两种类型同时出现的电影数量,以获得两种类型之间的“强度”?
  • @CommuSoft 是的,例如如果动作戏剧的组合出现在3部电影中,“强度”是3
  • 在数据库端进行处理不是更有效率吗?一般来说,SQL 在这些方面要好得多……你能提供数据库的结构吗?

标签: php graph-visualization vis.js


【解决方案1】:

您可以在 SQL 级别进行处理,例如使用以下查询:

SELECT a.genreId,b.genreId,count(*)
FROM genres as a, genres as b
WHERE a.contentId = b.contentId AND a.genreId < b.genreId
GROUP BY a.genreId, b.genreId

see an online demo here

在您的示例中,id 被编号为流派:

1 Drama
2 Action
3 Comedy
4 Documentary
5 Romantic

【讨论】:

  • 奖励积分在哪里?你甚至没有投票赞成答案:|
  • 嗯,加分是比喻。 :-0 这些可以分发吗?没有意识到除了将答案标记为已接受之外,我还应该投票。完成。
猜你喜欢
  • 2012-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-31
  • 1970-01-01
  • 2015-11-18
  • 1970-01-01
  • 2019-02-21
相关资源
最近更新 更多