###haohaohao###图神经网络之神器——PyTorch Geometric 上手 & 实战

2023-10-27

图神经网络(Graph Neural Networks, GNN)最近被视为在图研究等领域一种强有力的方法。跟传统的在欧式空间上的卷积操作类似,GNNs通过对信息的传递,转换和聚合实现特征的提取。这篇博客主要想分享下,怎样在你的项目中简单快速地实现图神经网络。你将会了解到怎样用PyTorch Geometric 去构建一个图神经网络,以及怎样用GNN去解决一个实际问题(Recsys Challenge 2015)。

我们将使用PyTorch 和 PyG(PyTorch Geometric Library)。PyG是一个基于PyTorch的用于处理不规则数据(比如图)的库,或者说是一个用于在图等数据上快速实现表征学习的框架。它的运行速度很快,训练模型速度可以达到DGL(Deep Graph Library )v0.2 的40倍(数据来自论文)。除了出色的运行速度外,PyG中也集成了很多论文中提出的方法(GCN,SGC,GAT,SAGE等等)和常用数据集。因此对于复现论文来说也是相当方便。由于速度和方便的优势,毫无疑问,PyG是当前最流行和广泛使用的GNN库。让我们开始吧。

Requirments:

  • Python 3
  • PyTorch
  • PyTorch Geometric

PyG Basics

这部分将会带你了解PyG的基础知识。重要的是会涵盖torch_gemotric.datatorch_geometric.nn。 你将会了解到怎样将你的图数据导入你的神经网络模型,以及怎样设计一个MessagePassing layer。这个也是GNN的核心。

Data

torch_geometric.data这个模块包含了一个叫Data的类。这个类允许你非常简单的构建你的图数据对象。你只需要确定两个东西:

  1. 节点的属性/特征(the attributes/features associated with each node, node features
  2. 邻接/边连接信息(the connectivity/adjacency of each node, edge index

让我们用一个例子来说明一个写怎样创建一个Data对象。

在这个图里有4个节点,V1,V2,V3,V4,每一个都带有一个2维的特征向量,和一个标签y,代表这个节点属于哪一类。

这两个东西可以用FloatTesonr来表示:

​x = torch.tensor([[2,1],[5,6],[3,7],[12,0]], dtype=torch.float) 
y = torch.tensor([0,1,0,1], dtype=torch.float)

图的节点连接信息要以COO格式进行存储。在COO格式中,COO list 是一个2*E 维的list。第一个维度的节点是源节点(source nodes),第二个维度中是目标节点(target nodes),连接方式是由源节点指向目标节点。对于无向图来说,存贮的source nodes 和 target node 是成对存在的。

方式1

​edge_index = torch.tensor([[0,1,2,0,3],
                          [1,0,1,3,2]],dtype=torch,long)

方式2

edge_index = torch.tensor([[0, 1],
                           [1, 0],
                           [2, 1],
                           [0, 3]
                           [2, 3]], dtype=torch.long)

第二种方法在使用时要调用contiguous()方法。

边索引的顺序跟Data对象无关,或者说边的存储顺序并不重要,因为这个edge_index只是用来计算邻接矩阵(Adjacency Matrix)。

把它们放在一起我们就可以创建一个Data了。

# 方法一
import torch

from torch_geometric.data import Data

x = torch.tensor([[2,1],[5,6],[3,7],[12,0]],dtype=torch.float)

y = torch.tensor([[0,2,1,0,3],[3,1,0,1,2]],dtype=torch.long)

​edge_index = torch.tensor([[0,1,2,0,3],
                          [1,0,1,3,2]],dtype=torch,long)

data = Data(x=x,y=y,edge_index=edge_index)
# 方法二
import torch

from torch_geometric.data import Data

x = torch.tensor([[2,1],[5,6],[3,7],[12,0]],dtype=torch.float)

y = torch.tensor([[0,2,1,0,3],[3,1,0,1,2]],dtype=torch.long)

edge_index = torch.tensor([[0, 1],
                           [1, 0],
                           [2, 1],
                           [0, 3]
                           [2, 3]], dtype=torch.long)

data = Data(x=x,y=y,edge_index=edge_index.contiguous())

这样我们就创建了一个新的Data。其中x,y,edge_index 是最基本的键值(key)。 你也可以添加自己的key。有了这个data,你可以在程序中非常方便的调用处理你的数据。

Dataset

数据集Dataset的创建不像Data一样简单直接了。Dataset有点像torchvision,它有着自己的规则。

PyG提供两种不同的数据集类:

  • InMemoryDataset
  • Dataset

要创建一个InMemoryDataset,你必须实现一个函数

  • Raw_file_names()

它返回一个包含没有处理的数据的名字的list。如果你只有一个文件,那么它返回的list将只包含一个元素。事实上,你可以返回一个空list,然后确定你的文件在后面的函数process()中。

  • Processed_file_names()

很像上一个函数,它返回一个包含所有处理过的数据的list。在调用process()这个函数后,通常返回的list只有一个元素,它只保存已经处理过的数据的名字。

  • Download()

这个函数下载数据到你正在工作的目录中,你可以在self.raw_dir中指定。如果你不需要下载数据,你可以在这函数中简单的写一个

pass

就好。

  • Process()

这是Dataset中最重要的函数。你需要整合你的数据成一个包含data的list。然后调用 self.collate()去计算将用DataLodadr的片段。下面这个例子来自PyG官方文档。

import torch
from torch_geometric.data import InMemoryDataset


class MyOwnDataset(InMemoryDataset):
    def __init__(self, root, transform=None, pre_transform=None):
        super(MyOwnDataset, self).__init__(root, transform, pre_transform)
        self.data, self.slices = torch.load(self.processed_paths[0])

    @property
    def raw_file_names(self):
        return ['some_file_1', 'some_file_2', ...]

    @property
    def processed_file_names(self):
        return ['data.pt']

    def download(self):
        # Download to `self.raw_dir`.

    def process(self):
        # Read data into huge `Data` list.
        data_list = [...]

        if self.pre_filter is not None:
            data_list [data for data in data_list if self.pre_filter(data)]

        if self.pre_transform is not None:
            data_list = [self.pre_transform(data) for data in data_list]

        data, slices = self.collate(data_list)
        torch.save((data, slices), self.processed_paths[0])

我将会在后面介绍怎样从RecSys 2015 提供的数据构建一个用于PyG的一般数据集。

DataLoader

DataLoader 这个类允许你通过batch的方式feed数据。创建一个DotaLoader实例,可以简单的指定数据集和你期望的batch size。

loader = DataLoader(dataset, batch_size=512, shuffle=True)

DataLoader的每一次迭代都会产生一个Batch对象。它非常像Data对象。但是带有一个‘batch’属性。它指明了了对应图上的节点连接关系。因为DataLoader聚合来自不同图的的batch的x,y 和edge_index,所以GNN模型需要batch信息去知道那个节点属于哪一图。

for batch in loader:
    batch
    >>> Batch(x=[1024, 21], edge_index=[2, 1568], y=[512], batch=[1024])

MessagePassing

这个GNN的本质,它描述了节点的embeddings是怎样被学习到的。

作者已经将MessagePassing这个接口写好,以便于大家快速实现自己的想法。如果想使用这个框架,就要重新定义三个方法:

  1. message
  2. update
  3. aggregation scheme

在实现message的时候,节点特征会自动map到各自的source and target nodes。 aggregation scheme 只需要设置参数就好,sum, mean or max

对于一个简单的GCN来说,我们只需要按照以下步骤,就可以快速实现一个GCN:

  1. 添加self-loop 到邻接矩阵(Adjacency Matrix)。
  2. 节点特征的线性变换。
  3. 标准化节点特征。
  4. 聚合邻接节点信息。
  5. 得到节点新的embeddings

步骤1 和 2 需要在message passing 前被计算好。 3 - 5 可以torch_geometric.nn.MessagePassing 类。

添加self-loop的目的是让featrue在聚合的过程中加入当前节点自己的feature,没有self-loop聚合的就只有邻居节点的信息。

Example 1 下面是官方文档的一个GCN例子,其中注释中的Step 1-5对应上文的步骤1-5.

import torch
from torch_geometric.nn import MessagePassing
from torch_geometric.utils import add_self_loops, degree

class GCNConv(MessagePassing):
    def __init__(self, in_channels, out_channels):
        super(GCNConv, self).__init__(aggr='add')  # "Add" aggregation.
        self.lin = torch.nn.Linear(in_channels, out_channels)

    def forward(self, x, edge_index):
        # x has shape [N, in_channels]
        # edge_index has shape [2, E]

        # Step 1: Add self-loops to the adjacency matrix.
        edge_index, _ = add_self_loops(edge_index, num_nodes=x.size(0))

        # Step 2: Linearly transform node feature matrix.
        x = self.lin(x)

        # Step 3-5: Start propagating messages.
        return self.propagate(edge_index, size=(x.size(0), x.size(0)), x=x)

    def message(self, x_j, edge_index, size):
        # x_j has shape [E, out_channels]

        # Step 3: Normalize node features.
        row, col = edge_index
        deg = degree(row, size[0], dtype=x_j.dtype)
        deg_inv_sqrt = deg.pow(-0.5)
        norm = deg_inv_sqrt[row] * deg_inv_sqrt[col]

        return norm.view(-1, 1) * x_j

    def update(self, aggr_out):
        # aggr_out has shape [N, out_channels]

        # Step 5: Return new node embeddings.
        return aggr_out

所有的逻辑代码都在forward()里面,当我们调用propagate()函数之后,它将会在内部调用message()和update()。

Example 2 下面是一个SAGE的例子

import torch
from torch.nn import Sequential as Seq, Linear, ReLU
from torch_geometric.nn import MessagePassing
from torch_geometric.utils import remove_self_loops, add_self_loops
class SAGEConv(MessagePassing):
    def __init__(self, in_channels, out_channels):
        super(SAGEConv, self).__init__(aggr='max') #  "Max" aggregation.
        self.lin = torch.nn.Linear(in_channels, out_channels)
        self.act = torch.nn.ReLU()
        self.update_lin = torch.nn.Linear(in_channels + out_channels, in_channels, bias=False)
        self.update_act = torch.nn.ReLU()
        
    def forward(self, x, edge_index):
        # x has shape [N, in_channels]
        # edge_index has shape [2, E]
        
        
        edge_index, _ = remove_self_loops(edge_index)
        edge_index, _ = add_self_loops(edge_index, num_nodes=x.size(0))
        
        
        return self.propagate(edge_index, size=(x.size(0), x.size(0)), x=x)

    def message(self, x_j):
        # x_j has shape [E, in_channels]

        x_j = self.lin(x_j)
        x_j = self.act(x_j)
        
        return x_j

    def update(self, aggr_out, x):
        # aggr_out has shape [N, out_channels]


        new_embedding = torch.cat([aggr_out, x], dim=1)
        
        new_embedding = self.update_lin(new_embedding)
        new_embedding = self.update_act(new_embedding)
        
        return new_embedding

上面的部分主要介绍了怎样把数据编程Data,以及通过MessagPassing来实现自己的想法,也就是怎样生成新的embeddings。至于怎样训练模型可以看下面的内容,以及参考官方的示例(https://github.com/rusty1s/pytorch_geometric/tree/master/examples)。


A Real-World Example —— RecSys Challenge 2015

RecSys Challenge 2015 是一个推荐算法竞赛。参与者被要求完成以下两个任务:

  • 通过一个点击序列预测是否会产生一个购买行为。
  • 预测哪个产品将要被购买。

首先,我们可以在官网(https://recsys.acm.org/recsys15/challenge/)下载数据并且构建成一个数据集。然后开始做第一个任务,因为它比较简单。竞赛提供了两个主要的数据集。 yoochoose-clicks.dat yoochoose-buys.dat,分别各自包含点击事件和购买事件。

Preprocessing

在下载完数据之后,我们需要对它进行预处理,这样它可以被fed进我们的模型。

from sklearn.preprocessing import LabelEncoder

df = pd.read_csv('../input/yoochoose-click.dat', header=None)
df.columns=['session_id','timestamp','item_id','category']

buy_df = pd.read_csv('../input/yoochoose-buys.dat', header=None)
buy_df.columns=['session_id','timestamp','item_id','price','quantity']

item_encoder = LabelEncoder()
df['item_id'] = item_encoder.fit_transform(df.item_id)
df.head()

因为数据集很大。我们用子图以方便演示。

#randomly sample a couple of them
sampled_session_id = np.random.choice(df.session_id.unique(), 1000000, replace=False)
df = df.loc[df.session_id.isin(sampled_session_id)]
df.nunique()

为了确定一个ground truth。 对于一个给定的session,是否存在一个购买事件。我们简单的检查是否一个 session_id 在 yoochoose-clicks.dat 也出现在 yoochoose-buys.dat 中。

df['label'] = df.session_id.isin(buy_df.session_id)
df.head()

 

数据集的构建 Dataset Construction

在预处理步骤之后,就可以将数据转换为Dataset对象了。在这里,我们将session中的每个item都视为一个节点,因此同一session中的所有items都形成一个图。为了构建数据集,我们通过session_id对预处理的数据进行分组,并在这些组上进行迭代。在每次迭代中,对每个图中节点索引应0开始。

import torch
from torch_geometric.data import InMemoryDataset
from tqdm import tqdm

class YooChooseBinaryDataset(InMemoryDataset):
    def __init__(self, root, transform=None, pre_transform=None):
        super(YooChooseBinaryDataset, self).__init__(root, transform, pre_transform)
        self.data, self.slices = torch.load(self.processed_paths[0])

    @property
    def raw_file_names(self):
        return []
    @property
    def processed_file_names(self):
        return ['../input/yoochoose_click_binary_1M_sess.dataset']

    def download(self):
        pass
    
    def process(self):
        
        data_list = []

        # process by session_id
        grouped = df.groupby('session_id')
        for session_id, group in tqdm(grouped):
            sess_item_id = LabelEncoder().fit_transform(group.item_id)
            group = group.reset_index(drop=True)
            group['sess_item_id'] = sess_item_id
            node_features = group.loc[group.session_id==session_id,['sess_item_id','item_id']].sort_values('sess_item_id').item_id.drop_duplicates().values

            node_features = torch.LongTensor(node_features).unsqueeze(1)
            target_nodes = group.sess_item_id.values[1:]
            source_nodes = group.sess_item_id.values[:-1]

            edge_index = torch.tensor([source_nodes, target_nodes], dtype=torch.long)
            x = node_features

            y = torch.FloatTensor([group.label.values[0]])

            data = Data(x=x, edge_index=edge_index, y=y)
            data_list.append(data)
        
        data, slices = self.collate(data_list)
        torch.save((data, slices), self.processed_paths[0])
        

 

在构建好数据集,我们使用shuffle()方法确保数据集被随机打乱。然后把数据集分成 3份,分别用作 training validation and testing.

dataset = dataset.shuffle()
train_dataset = dataset[:800000]
val_dataset = dataset[800000:900000]
test_dataset = dataset[900000:]
len(train_dataset), len(val_dataset), len(test_dataset)

Build a Graph Neural Networks

以下GNN引用了PyG官方Github存储库中的示例之一,并使用上面的example 2的SAGEConv层(不同于官方文档中的SAGEConv())。此外,还对输出层进行了修改以与binary classification设置匹配。

embed_dim = 128
from torch_geometric.nn import TopKPooling
from torch_geometric.nn import global_mean_pool as gap, global_max_pool as gmp
import torch.nn.functional as F
class Net(torch.nn.Module):
    def __init__(self):
        super(Net, self).__init__()

        self.conv1 = SAGEConv(embed_dim, 128)
        self.pool1 = TopKPooling(128, ratio=0.8)
        self.conv2 = SAGEConv(128, 128)
        self.pool2 = TopKPooling(128, ratio=0.8)
        self.conv3 = SAGEConv(128, 128)
        self.pool3 = TopKPooling(128, ratio=0.8)
        self.item_embedding = torch.nn.Embedding(num_embeddings=df.item_id.max() +1, embedding_dim=embed_dim)
        self.lin1 = torch.nn.Linear(256, 128)
        self.lin2 = torch.nn.Linear(128, 64)
        self.lin3 = torch.nn.Linear(64, 1)
        self.bn1 = torch.nn.BatchNorm1d(128)
        self.bn2 = torch.nn.BatchNorm1d(64)
        self.act1 = torch.nn.ReLU()
        self.act2 = torch.nn.ReLU()        
  
    def forward(self, data):
        x, edge_index, batch = data.x, data.edge_index, data.batch
        x = self.item_embedding(x)
        x = x.squeeze(1)        

        x = F.relu(self.conv1(x, edge_index))

        x, edge_index, _, batch, _ = self.pool1(x, edge_index, None, batch)
        x1 = torch.cat([gmp(x, batch), gap(x, batch)], dim=1)

        x = F.relu(self.conv2(x, edge_index))
     
        x, edge_index, _, batch, _ = self.pool2(x, edge_index, None, batch)
        x2 = torch.cat([gmp(x, batch), gap(x, batch)], dim=1)

        x = F.relu(self.conv3(x, edge_index))

        x, edge_index, _, batch, _ = self.pool3(x, edge_index, None, batch)
        x3 = torch.cat([gmp(x, batch), gap(x, batch)], dim=1)

        x = x1 + x2 + x3

        x = self.lin1(x)
        x = self.act1(x)
        x = self.lin2(x)
        x = self.act2(x)      
        x = F.dropout(x, p=0.5, training=self.training)

        x = torch.sigmoid(self.lin3(x)).squeeze(1)

        return x

Training

训练自定义GNN非常容易,只需迭代从训练集构造的DataLoader,然后反向传播损失函数。在这里,使用Adam作为优化器,将学习速率设置为0.005,将Binary Cross Entropy作为损失函数。

def train():
    model.train()

    loss_all = 0
    for data in train_loader:
        data = data.to(device)
        optimizer.zero_grad()
        output = model(data)
        label = data.y.to(device)
        loss = crit(output, label)
        loss.backward()
        loss_all += data.num_graphs * loss.item()
        optimizer.step()
    return loss_all / len(train_dataset)
    
device = torch.device('cuda')
model = Net().to(device)
optimizer = torch.optim.Adam(model.parameters(), lr=0.005)
crit = torch.nn.BCELoss()
train_loader = DataLoader(train_dataset, batch_size=batch_size)
for epoch in range(num_epochs):
    train()

Validation

标签存在大量的negative标签,数据是高度不平衡的,因为大多数会话之后都没有任何购买事件。换句话说,一个愚蠢的模型可能会预测所有的情况为negative,从而使准确率达到90%以上。因此,代替准确度,AUC是完成此任务的更好指标,因为它只在乎阳性实例的得分是否高于阴性实例。我们使用来自Sklearn的现成AUC计算功能。

def evaluate(loader):
    model.eval()

    predictions = []
    labels = []

    with torch.no_grad():
        for data in loader:

            data = data.to(device)
            pred = model(data).detach().cpu().numpy()

            label = data.y.detach().cpu().numpy()
            predictions.append(pred)
            labels.append(label)

Result

以下是对模型进行1个epoch的训练,并打印相关参数:

for epoch in range(1):
    loss = train()
    train_acc = evaluate(train_loader)
    val_acc = evaluate(val_loader)    
    test_acc = evaluate(test_loader)
    print('Epoch: {:03d}, Loss: {:.5f}, Train Auc: {:.5f}, Val Auc: {:.5f}, Test Auc: {:.5f}'.
          format(epoch, loss, train_acc, val_acc, test_acc))

Conclusion

到此,你已经学会了PyG的基本用法,包括数据集的构建,定制GNN网络,训练GNN模型。以上代码以及主要内容均来自于官方文档以及https://towardsdatascience.com/hands-on-graph-neural-networks-with-pytorch-pytorch-geometric-359487e221a8 这个博客。希望对你有所帮助。更多PyG的介绍和example可以查询官方文档和官方的Github库。

最后,

Sharing is carrying.

参考链接:

Fast Graph Representation Learning with PyTorch Geometric​rlgm.github.io

 

PyTorch Geometric Documentation​pytorch-geometric.readthedocs.io

 

Hands-on Graph Neural Networks with PyTorch & PyTorch Geometric​towardsdatascience.com

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

###haohaohao###图神经网络之神器——PyTorch Geometric 上手 & 实战 的相关文章

  • 借助neo4j-admin导入csv文件构建实体与联系

    文章目录 1 CSV 导入的文件格式 数据类型 实体csv文件 关系csv文件 2 CSV 导入 neo4j 案例 不同导入工具的区别 1 CSV 导入的文件格式 官方DOC https neo4j com docs operations
  • KBQA是个啥?

    什么是KBQA KBQA的全称是基于知识库问答 Knowledge Base Question Answering 即给定自然语言问题 通过对问题进行语义理解和解析 进而利用知识库进行查询 推理得出答案 知识库是用于知识管理的一种特殊的数据
  • 设计模式-2.2类之间的6种关系

    1 继承关系 2 实现关系 3 依赖关系 4 关联关系 5 聚合关系 6 组合关系 7 类图建模步骤 1 继承 extends 泛化 在UML中用带空心三角形的实线表示 指向父类 2 实现 implements 类实现接口 可多个 虚线空心
  • 力导向图知识图谱可视化(节点可点击)

    用d3 js的力导向图写了一个知识图谱可视化的demo 节点可点击着实费了我不少功夫 如果小伙伴有更简单的方法还求留言呢 由于数据市实验室的某项目 不太好直接贴出来 反正这样的格式就好 反正是给大家参考的 name name type 0
  • 基于知识图谱的个性化学习推荐系统的设计与实现_kaic

    摘 要 Abstract 1 绪 论 1 1 研究背景及意义 1 2 国内外现状研究 1 3 研究工作和论文结构 2 相关技术 2 1 HTML 语言 2 2 Python 语言 2 3 数据库技术 2 4 Django 框架 3 系统分析
  • 实体-关系联合抽取:Knowledge-Based Weak Supervision for Information Extraction of Overlapping Relations

    论文地址 https www aclweb org anthology P11 1055 pdf 文章标题 Knowledge BasedWeak Supervision for Information Extraction of Over
  • 搜索引擎和知识图谱那些事 (上).基础篇

    这是一篇基础性文章 主要介绍搜索引擎和知识图谱的一些原理 发展经历和应用等知识 希望文章对你有所帮助 如果有错误或不足之处 还请海涵 参考资料见后 一 搜索引擎 一 搜索引擎的四个时代 根据张俊林大神的 这就是搜索引擎 这本书中描述 推荐大
  • 清华裴丹:我在智能运维科研领域的一些思考

    前言 中国应用性能管理行业盛宴 2017中国应用性能管理大会 简称APMCon 2017 于8月10日至11日在北京新云南皇冠假日酒店隆重召开 本届APMCon是由听云 极客邦和InfoQ联合主办 作为国内APM领域最具影响力的技术大会 本
  • Neo4j:入门基础(二)之导入CSV文件

    CSV文件 1 csv文件推荐是utf 8编码 否则会造成中文乱码 2 csv文件默认需要放在import目录下 如需从远程或者其他本地目录导入 则需要修改conf neo4j conf load csv时文件路径 默认需要放在 NEO4J
  • A Survey of Knowledge-Enhanced Pre-trained Language Models

    本文是LLM系列的文章 针对 A Survey of Knowledge Enhanced Pre trained Language Models 的翻译 知识增强的预训练语言模型综述 摘要 1 引言 2 背景 3 KE PLMs用于NLU
  • Empowering Language Models with Knowledge Graph Reasoning for Open-Domain Question Answering

    本文是LLM系列文章 针对 Empowering Language Models with Knowledge Graph Reasoning for Open Domain Question Answering 的翻译 用知识图谱推理增强
  • 【neo4j】win10上利用neo4j-admin导入csv

    原因 我需要导入CN DBpedia到Neo4j中 包含900万 的百科实体以及6700万 的三元组关系 普通逐条插入可能速度太慢 所以要使用neo4j admin命令来进行导入 CN DBpedia原始数据直提供了txt格式的三元组数据
  • AI时代你需要知道的:知识图谱技术原理(必读)

    知识图谱是什么 知识图谱最早由谷歌发布 为了提升搜索引擎返回答案的质量以及用户查询的效率 在知识图谱辅助下 搜索引擎可以洞察到用户查询背后的一个语义信息 然后返回更为精准结构化的信息 从而更大可能的去满足用户的一个查询需求 当我们进行搜索时
  • 知识图谱之知识融合

    最近在 小象学院 上知识图谱的课程 做了一些笔记 现整理了一下 1 什么是知识融合 将来自不同知识库的同一实体融合在一起 目标 融合各层面的知识 合并两个知识图谱 本体 需要确认的是 1 等价实例 实体的匹配 左右两个人是同一个人 sams
  • 基于依存句法分析的实体关系提取

    基于依存句法分析的实体关系提取 1 概述 概述 句法分析是自然语言处理中的关键技术之一 其基本任务是确定句子的句法结构或者句子中词汇之间的依存关系 主要包括两方面的内容 一是确定语言的语法体系 即对语言中合法的句子的语法结构给与形式化的定义
  • ChatGPT启示录: 智能、推理的本质是什么?神经网络既是推理机,也是知识规则库?

    多种因素让人类对自身的智力产生了一种自信 毕竟这个世界上其他生物没有我们大脑发达 智力似乎是上天给人类的独有礼物 作为孩子的父母 老师说孩子不努力似乎是可以接受的 但是说自己娃娃笨是极其羞辱的 类似的 让很多人不能接受的是 机器人可以算得比
  • 【Neo4j】第 3 章:使用 Pure Cypher 为您的业务赋能

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • 人工智能知识表示与推理:构建智能系统的认知引擎

    导言 人工智能知识表示与推理是构建智能系统认知引擎的关键组成部分 本文将深入研究知识表示的方法和推理技术 以及它们在解决现实问题和提升智能系统智能水平中的作用 1 知识表示方法 符号表示法 使用符号和逻辑关系来表示知识 例如谓词逻辑 连接主
  • 智能时代:自然语言生成SQL与知识图谱问答实战

    语义解析 前言 语义解析的应用场景 总结概论 语义解析和大模型的关系 延伸阅读 前言 语义解析技术可以提高人机交互的效率和准确性 在自然语言处理 数据分析 智能客服 智能家居等领域都有广泛的应用前景 特别是在大数据时代 语义解析能够帮助企业
  • 使用 Neo4j 和 LangChain 集成非结构化知识图增强 QA

    目前基于大模型的信息检索有两种方法 一种是基于微调的方法 一种是基于 RAG 的方法 信息检索和知识提取是一个不断发展的领域 随着大型语言模型 LLM 和知识图的出现 这一领域发生了显着的变化 特别是在多跳问答的背景下 接下来我们继续深入

随机推荐

  • 公开数据及 贝叶斯网络_贝叶斯网络(Bayesian Network)可视化

    一起读数据 贝叶斯网络 1 贝叶斯网络简介 贝叶斯网络是有向无环图的一种概率图模型 它在1988年由图灵奖得主Judea Pearl提出 主要用于不确定性表达和推理 有向无环图由节点和边组成 每条边代表了节点间的相互关系 在贝叶斯网络中 一
  • 【Spark编程基础】实验5 Spark Structured Streaming编程实践

    实验5 Spark Structured Streaming编程实践 实验内容和要求 0 结构化流练习任务 0 1 讲义文件源 json数据任务 按照讲义中json数据的生成及分析 复现实验 并适当分析 1 创建程序生成JSON格式的Fil
  • C# 创建二叉树以及深度遍历二叉树

    没想到多叉树的深度遍历真的用上了 最近有个功能一定要得到将UI层级完全展开后 从上到下依次记录每个物体的层级顺序 用到了后序深度遍历 之前项目用到了树形存储的配置结构 多叉树除了用于配置结构外 还有用于复杂文件目录结构 二叉树一个比较经典的
  • mac .ssh文件在哪里查找

    Finder gt 前往 gt 前往文件夹 gt 输入 ssh 即 shift command G gt 输入 ssh
  • win10桌面创建我的电脑/回收站/网络/控制面板

    方法 步骤 1 选择个性化设置选项 开始 设置 个性化 在电脑桌面鼠标右键 打开菜单 选择个性化设置选项 打开设置页面 2 进入桌面图标设置选项 在个性化设置页面中 打开主题选项 进入桌面图标设置选项 3 创建我的电脑 我们就可以勾选计算机
  • 人事档案调档步骤

    人事档案调档步骤 确定档案所在人才市场地 注 1 本科毕业后 未持报到证去报到的 可在大学档案去处查询自己的档案去处 拿报到证去报到 若报到证遗失 则需要补办报到证去报到 必须有报到证报到 单位开具调档申请 去杭州人才市场开具调档函 需身份
  • html点击按钮弹出悬浮窗_网课助手1.0 支持悬浮窗搜题等多功能

    临近期末 又到了大学生期末网课考试测试的环节 以本人来看 这就是浪费时间 估计没有几个人真正的做题 基本就是百度题目 但是一个一个查题真的太麻烦了 最近在网上找的脚本基本都是电脑浏览器端的 没有手机端的 没有就自己动手 做了个自动网课查题工
  • 【干货】股票接口代码和能可视化数据分享,可以爬取数据并能入库可视化展示到页面中,非常适合投资理财学习使用(亲测OK)

    目录 目标 内容介绍 流程如下 目标 采集到股票数据 并且直接展示到可视化大屏上 内容介绍 如果你对Python感兴趣 或者你准备炒股 想对数据分析一下 那么恭喜您 这篇文章正好能够满足您的需要 这篇文章能够把代码给到你 并且给你不用代码
  • LIO_SAM实测运行,论文学习及代码注释[附对应google driver数据]

    LIO SAM Tightly coupled Lidar Inertial Odometry via Smoothing and Mapping 作者Tixiao Shan在2018年发表过LeGO LOAM 当时他还在史蒂文斯理工学院读
  • 实现流程编排设计器的心路历程

    接上回 AntV 使用AntV X6实现流程编排设计器 一文说到 流程编排设计器的实现方案是将低代码引擎和AntV X6作为画布相结合 为什么会有这样的想法 可行性 起因是业务中有用到低代码引擎的场景 它的交互形式 页面结构正好符合流程编排
  • 成为极少数-读后感

    文章目录 自序 真正的成长 都需要你孤独地翻山越岭 觉醒 自我驱动的人是不会焦虑的 上进 只有突破才叫上进 动力 我经常对自己吹牛皮 自律 围绕目标的自我约束 专注 做到勤奋的样子很容易 第二章 方向与精进 思维 建立这三个思维 增加竞争优
  • linux history命令详解

    命令行历史 当执行命令后 系统默认会在内存记录执行过的命令 当用户正常退出时 会将内存的命令历史存放对应历史文件中 默认是 bash history 登录shell时 会读取命令历史文件中记录下的命令加载到内存中 登录进shell后新执行的
  • PC微信逆向:破解聊天记录文件!

    本文转载自程序员专栏 在电子取证过程中 也会遇到提取PC版微信数据的情况 看雪 52破解和CSDN等网上的PC版微信数据库破解文章实在是太简略了 大多数只有结果没有过程 经过反复试验终于成功解密了数据库 现在把详细过程记录下来 希望大家不要
  • PC微信低版本限制登录怎么办?

    前文 最近很多小伙伴遇到了低版本的微信登录时出现 您的微信版本过低 请升级至最新版本微信后在登录微信 点击 确定 后 将跳转至最新版下载页面 或出现未能登录等字样 解决方案 安装最新版本微信 登录一次后 然后在切换低版本微信登录 一般情况下
  • Arduino 连接JDY-08蓝牙模块

    Arduino 连接JDY 08蓝牙模块 文章目录 Arduino 连接JDY 08蓝牙模块 简介 一 基本连接 二 软件连接 三 手机连接 简介 从蓝牙4 0开始包含两个蓝牙芯片模块 传统 经典蓝牙模块 Classic Bluetooth
  • PyQt5中ui文件如何转为Py文件并界面可视化

    1 在pycharm里的File里面找到setting 2 Tools工具里找到External Tools 3 选择 添加 其中Name 根据你自己想法取 这里写的是 Qt Designer Program 这里是找到你的designer
  • 应用程序签名机制

    原文链接 http www 2cto com Article 201308 237263 html Android安全机制分析 Android系统是基于Linux内核开发的 因此 Android系统不仅保留和继承了Linux操作系统的安全机
  • AttributeError: 'module' object has no attribute 的解决方法

    AttributeError module object has no attribute funSalaryGuide 这个错误相信很多django的开发人员都会遇到 一般来说都是应用没有安装完成 重新安装就可以了 这几天我遇到的情况是已
  • 【Xilinx DMA】Xilinx FPGA DMA介绍

    DMA Direct Memory Access 直接内存访问 可以在不受CPU干预的情况下 完成对内存的存取 在PS和PL两端都有DMA 其中PS端的是硬核DMA 而PL端的是软核DMA 如何选用这两个DMA呢 如果从PS端的内存DDR3
  • ###haohaohao###图神经网络之神器——PyTorch Geometric 上手 & 实战

    图神经网络 Graph Neural Networks GNN 最近被视为在图研究等领域一种强有力的方法 跟传统的在欧式空间上的卷积操作类似 GNNs通过对信息的传递 转换和聚合实现特征的提取 这篇博客主要想分享下 怎样在你的项目中简单快速