2

我正在处理一个样本数据,其中包含几篇论文、它们所属的主题以及这些论文的发表年份,它看起来像这样:

paper_id 话题 pub_year
2031361154 0 1998
2088633475 1 1995
1987003396 2 1995
2246118404 3 1992
2017547909 1 1996
2032449907 4 1993
2053684599 0 1991
1968369145 1 1997
2160198778 4 1997
2026639487 3 1991

我正在尝试重新调整这些论文的发表年份(保持每个主题的论文数量和每年发表的论文数量不变),为空模型做准备。如果没有约束,这可以通过简单地完成np.random.permutation。改组出版年份后的示例表如下:

paper_id 话题 reshuffled_pub_year
2031361154 0 1998
2088633475 1 1997
1987003396 2 1995
2246118404 3 1992
2017547909 1 1996
2032449907 4 1993
2053684599 0 1991
1968369145 1 1997
2160198778 4 1995
2026639487 3 1991

但我想确保这些论文的改组年份保持在相应主题的期限内。例如,在第一个表中,关于主题 1 的论文仅在 1995 年、1996 年和 1997 年发表,因此所有关于主题 1 的论文的重新洗牌年份都停留在 1995 年至 1997 年期间。同理,[1991 年的主题 0, 1998],[1995] 中的主题 2,[1991,1992] 中的主题 3 和 [1993,1997] 中的主题 4。但是在第二个表中,2246118404 号论文的改版发表年份是 1998 年,因为这篇论文是关于主题 3,所以年份只能是 1991 年或 1992 年。所以我需要在改版期间指定约束条件。

我已经搜索过有关此问题的网页和论文,我认为这个问题可以建模为具有约束的双向网络保度随机化。该二分网络中的两种节点类型是 topic 和 pub_year,下图给出了一个示例网络:

示例网络

为了重新调整这个二分网络中的链接,我尝试configuration_model使用networkxpython。所以我可以保证题目的度数和年数(不过这和没区别np.random.permutation?)。但据我所知,configuration_model不接受任何约束。在此示例中,tp1 具有指向 y1 和 y2 的链接。因此,在所需的重新洗牌网络中,tp1 不能有到 y3 和 y4 的链接。同样,(tp2,y4)、(tp3,y1/y3)、(tp4,y1/y2) 之间没有链接。

我想知道我是否朝着正确的方向前进,即将这个任务建模为双向网络重组问题。如果是这样,我可以使用任何工具来完成这项任务吗?

4

1 回答 1

0

一个简单的脚本来做 yaer 洗牌:

import random

# replace it with your data
papers = [
    {"paper_id": 2031361154, "topic": 0, "year": 1998},
    {"paper_id": 2088633475, "topic": 1, "year": 1995},
    {"paper_id": 1987003396, "topic": 2, "year": 1995},
    {"paper_id": 2246118404, "topic": 3, "year": 1992},
    {"paper_id": 2017547909, "topic": 1, "year": 1996},
    {"paper_id": 2032449907, "topic": 4, "year": 1993},
    {"paper_id": 2053684599, "topic": 0, "year": 1991},
    {"paper_id": 1968369145, "topic": 1, "year": 1997},
    {"paper_id": 2160198778, "topic": 4, "year": 1997},
    {"paper_id": 2026639487, "topic": 3, "year": 1991}
]

topicRanges = {}
for paper in papers:
    topic = paper["topic"]
    if topic in topicRanges:
        topicRanges[topic] = {
            "min": min(paper["year"], topicRanges[topic]["min"]),
            "max": max(paper["year"], topicRanges[topic]["max"])
        }
    else:
        topicRanges[topic] = {"min": paper["year"], "max": paper["year"]}

shuffled = []
for paper in papers:
    topic = paper["topic"]
    topicRange = topicRanges[topic]
    year = random.randint(topicRange["min"], topicRange["max"])
    shuffled.append(
        {"paper_id": paper["paper_id"], "topic": topic, "year": year})

print(shuffled)
于 2021-04-05T09:06:22.077 回答