如何可视化单词模式?

How to visualize word patterns?

我的数据结构如下所示:

<client>: {
    <document>: [
        {'start': <datetime>,
         'end': <datetime>,
         'group': <string>}
    ]
 }

<document> 中的词典列表按 'start' 日期排序,新条目不能在其结束的条目之前开始。我遍历这个数据结构,并随着时间的推移收集 group 的值到一个新的结构中,例如:

<client>: {
    <document>: {'progression': <group_1>|<group_2>|...|<group_n>}
 }

其中 <group_1> 对应 <document> 中第一个字典的 'group' 的值,依此类推。我想为所有文档可视化 groups 的进程,例如,我知道我有 5,000 个以 "abc" 开头的条目(在第一个管道之前);其中,2,000 后面跟着 "def",所以 "abc"|"def"。其中,500 个恢复为 "abc":"abc"|"def"|"abc",其余 1,500 个恢复为 "ghi":"abc"|"def"|"ghi"。以 "abc" 开头的其余 3,000 个条目遵循一些不同的进展模式。

我想做的是通过类似于 Sankey 图或其他适当的树状结构来可视化这个进程,其中顶部节点将是 "abc",然后会有一个左边的 "thick" 分支对应不同的进展模式,右边的 "thinner" 分支对应 2,000 "abc" 个案例,然后是 "def"。那么 "def" 将是另一个具有相似分支的节点,一个导致新的 "abc" (对于 "abc"|"def"|"abc" 的情况)和一个导致 "ghi" (对于 "abc"|"def"|"ghi" 案例),最好在 "tree" 变薄时用每个节点中的计数进行注释。我使用 Python Counter 结构的组合来检索每个潜在进展的数字,但我不知道如何以编程方式创建可视化。

我的理解是大概是可以用dot语言解决的问题,还有像pydotand/orpygraphviz这样的包,但是我不确定我是不是在正确的轨道。

我认为在您的情况下,Sankey 图将是最佳选择。假设您有 data 结构来存储来自此处的组信息:'progression': <group_1>|<group_2>|...|<group_n>。然后你可以像这样构建Sankey图:

data = [
    [1,2,3,1,4],
    [1,4,2],
    [1,2,5,3,5],
    [1,3],
    [1,4,5,1,4,3],
    [1,5,4,3],
    [1,2,5,1,3,4],
    [1,5],
    [1,2,1,1,5,2],
    [1,5,4,3],
    [1,1,2,3,4,1]
]

# Append _1, _2... indices to differ paths like 1-2-2-1 and 1-2-1-2
nodes = sorted(list(set(itertools.chain(*[[str(e) + '_' + str(i) for i, e in enumerate(l)] for l in data]))))
countered = defaultdict(int)
for line in data:
    for i in range(len(line) - 1):
        countered[(str(line[i]) + '_' + str(i), str(line[i+1]) + '_' + str(i+1))] += 1
links = [
    {'source': key[0], 'target': key[1], 'value': value}
    for key, value in countered.items()
]

links = {
    'source': [nodes.index(key[0]) for key, value in countered.items()],
    'target': [nodes.index(key[1]) for key, value in countered.items()],
    'value': [value for key, value in countered.items()]
}

data_trace = dict(
    type='sankey',
    domain = dict(
      x =  [0,1],
      y =  [0,1]
    ),
    orientation = "h",
    valueformat = ".0f",
    node = dict(
      pad = 10,
      thickness = 30,
      line = dict(
        color = "black",
        width = 0
      ),
      label =  nodes
    ),
    link = links
)

layout =  dict(
    title = "___",
    height = 772,
    font = dict(
      size = 10
    ),    
)

fig = dict(data=[data_trace], layout=layout)
iplot(fig, validate=True)

它会画出这样的桑基图:

您可以找到有关 Sankey 在 plotly 中如何工作的更多信息