首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从文本和数字数据字典创建网络--训练GNN

从文本和数字数据字典创建网络--训练GNN
EN

Stack Overflow用户
提问于 2020-10-06 01:42:29
回答 1查看 207关注 0票数 1

我一直在使用FUNSD数据集来预测非结构化文档中的序列标记-- LayoutLM:文档图像理解的文本和布局的预训练。清理数据并将数据从数据块转移到数据帧后,如下所示:

数据集排列如下:

  • id是文档中每个单词组的唯一标识符,如列text (类似于节点)所示。
  • label标识单词组是被归类为“问题”还是“答案”。
  • linking表示“链接”(如边)的WordGroups,将相应的“问题”链接到“答案”。
  • 'box'表示相对于左上角(0.0)的单词组的位置坐标(x,y,x,y右下角)。
  • 'words'保存word组中的每个单独单词及其位置(方框)。

我的目标是训练一个分类器来识别列'words'中的单词,这些词是用图神经网络连接在一起的,第一步是能够将我当前的数据集转换成一个网络。我的问题如下:

  1. 是否有一种方法可以将列'words'中的每一行拆分为两列[box_word, text_word],每个列仅为一个单词,同时复制其他保留不变的列:[id, label, text, box],从而生成具有以下列:[box,text,label,box_word, text_word]的最终数据
  2. 我可以将列'text'text_word、一个热编码列label、多个数字boxbox_word的列拆分为单独的列,但是如何拆分/重新排列colum 'linking'以定义网络图的边缘?
  3. 我是否采用正确的路径使用数据train生成一个网络,并使用它来训练一个GNN?

任何和所有的帮助/提示将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-06 02:39:15

编辑:处理列words中的多个条目。

你的问题1和2在代码中得到了回答。实际上非常简单(假设数据格式由屏幕截图中所显示的内容正确表示)。摘要:

Q1:apply列上的拆分函数,由.tolist()解压缩,这样就可以创建单独的列。请参见这个职位

Q2:使用列表理解来解压额外的列表层,只保留非空边.

Q3:是的,也不是。是的,因为pandas擅长用异构类型组织数据。例如,lists、dict、int和float可以出现在不同的列中。一些I/O函数,如pd.read_csv()pd.read_json(),也非常方便。

然而,在数据访问中存在开销,这对于遍历行(记录)特别昂贵。因此,直接输入模型的转换数据通常被转换为numpy.array或更有效的格式。这种格式转换任务是数据科学家的唯一责任。

编码和输出

我编出了自己的样本数据集。不相关的列被忽略了(因为我没有义务也不应该这样做)。

代码语言:javascript
复制
import networkx as nx
import pandas as pd

# data
df = pd.DataFrame(
    data={
        "words": [
            [{"box": [1, 2, 3, 4], "text": "TO:"}, {"box": [7, 7, 7, 7], "text": "777"}],
            [{"box": [1, 2, 3, 4], "text": "TO:"}],
            [{"text": "TO:", "box": [1, 2, 3, 4]}, {"box": [4, 4, 4, 4], "text": "444"}],
            [{"text": "TO:", "box": [1, 2, 3, 4]}],
        ],
        "linking": [
            [[0, 4]],
            [],
            [[4, 6]],
            [[6, 0]],
        ]
    }
)


# Q1. split
def split(el):
    ls_box = []
    ls_text = []
    for dic in el:
        ls_box.append(dic["box"])
        ls_text.append(dic["text"])
    return ls_box, ls_text

# straightforward but receives a deprecation warning
df[["box_word", "text_word"]] = df["words"].apply(split).tolist()
# to avoid that,
ls_tup = df["words"].apply(split).tolist()  # len: 4x2
ls_tup_tr = list(map(list, zip(*ls_tup)))  # len: 2x4
df["box_word"] = ls_tup_tr[0]
df["text_word"] = ls_tup_tr[1]

# Q2. construct graph
ls_edges = [item[0] for item in df["linking"].values if len(item) > 0]
print(ls_edges)  # [[0, 4], [4, 6], [6, 0]]

g = nx.Graph()
g.add_edges_from(ls_edges)
list(g.nodes)  # [0, 4, 6]
list(g.edges)  # [(0, 4), (0, 6), (4, 6)]

Q1输出

代码语言:javascript
复制
# trim the first column for printing
df_show = df.__deepcopy__()
df_show["words"] = df_show["words"].apply(lambda s: str(s)[:10])
df_show

Out[51]: 
        words   linking                      box_word   text_word
0  [{'box': [  [[0, 4]]  [[1, 2, 3, 4], [7, 7, 7, 7]]  [TO:, 777]
1  [{'box': [        []                [[1, 2, 3, 4]]       [TO:]
2  [{'text':   [[4, 6]]  [[1, 2, 3, 4], [4, 4, 4, 4]]  [TO:, 444]
3  [{'text':   [[6, 0]]                [[1, 2, 3, 4]]       [TO:]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64218247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档