OpenBG是开放的数字商业知识图谱,是一个使用统一Schema组织、涵盖产品和消费需求的百万级多模态数据集。OpenBG由阿里巴巴藏经阁团队联合提供,开放的目标是利用开放的商业知识发现社会经济的价值,促进数字商务数字经济等领域的交叉学科研究,服务数字经济健康发展的国家战略需求。
OpenBG Benchmark是一个以OpenBG为基础构建的大规模开放数字商业知识图谱评测基准,包含多个子数据集和子任务。欢迎小伙伴打榜https://tianchi.aliyun.com/dataset/dataDetail?dataId=122271。
OpenBG500包含500个关系,从OpenBG中筛选采样得到。
本仓库是阿里天池电商知识图谱链接预测挑战赛的基线代码,运行代码后生成结果提交。
使用以下代码进行环境配置
git clone --recurse-submodules https://github.com/OpenBGBenchmark/OpenBG500_baselines.git
pip install -r requirements.txt
请将天池平台上的数据放置在./data/
,数据目录如下
data
|-- OpenBG500
| |-- OpenBG500_train.tsv # 训练数据
| |-- OpenBG500_dev.tsv # 验证数据
| |-- OpenBG500_test.tsv # 需要预测的数据,选手需为每条记录预测10个尾实体
| |-- OpenBG500_entity2text.tsv # 实体对应文本
| |-- OpenBG500_relation2text.tsv # 关系对应文本
| |-- OpenBG500_example_pred.tsv # 提交结果示例
数据集统计数据如下:
Dataset | # Ent | # Rel | # Train | # Dev | # Test |
---|---|---|---|---|---|
OpenBG500 | 249,743 | 500 | 1,242,550 | 5,000 | 5,000 |
- 三元组数据,tsv格式
# OpenBG500_train.tsv/OpenBG500_dev.tsv
头实体<\t>关系<\t>尾实体<\n>
- 实体/关系对应文本数据,tsv格式
# OpenBG500_entity2text.tsv/OpenBG500_relation2text.tsv
实体(关系)<\t>实体(关系)对应文本<\n>
- 评测相关数据格式
# OpenBG500_test.tsv,选手需要为每行记录补充10格预测的尾实体,提交格式参照OpenBG500_example_pred.tsv
头实体<\t>关系<\n>
# OpenBG500_example_pred.tsv
头实体<\t>关系<\t>尾实体1<\t>尾实体2<\t>...<\t>尾实体10<\n>
$ head -n 3 OpenBG500_train.tsv
ent_135492 rel_0352 ent_015651
ent_020765 rel_0448 ent_214183
ent_106905 rel_0418 ent_121073
- 读取原始数据:
with open('OpenBG500_train.tsv', 'r') as fp:
data = fp.readlines()
train = [line.strip('\n').split('\t') for line in data]
_ = [print(line) for line in train[:2]]
# ['ent_135492', 'rel_0352', 'ent_015651']
# ['ent_020765', 'rel_0448', 'ent_214183']
- 获取实体、关系对应文本字典:
ent2text
和rel2text
with open('OpenBG500_entity2text.tsv', 'r') as fp:
data = fp.readlines()
lines = [line.strip('\n').split('\t') for line in data]
_ = [print(line) for line in lines[:2]]
# ['ent_101705', '短袖T恤']
# ['ent_116070', '套装']
ent2text = {line[0]: line[1] for line in lines}
with open('OpenBG500_relation2text.tsv', 'r') as fp:
data = fp.readlines()
lines = [line.strip().split('\t') for line in data]
_ = [print(line) for line in lines[:2]]
# ['rel_0418', '细分市场']
# ['rel_0290', '关联场景']
rel2text = {line[0]: line[1] for line in lines}
- 数据转换成文本:
train = [[ent2text[line[0]],rel2text[line[1]],ent2text[line[2]]] for line in train]
_ = [print(line) for line in train[:2]]
# ['苦荞茶', '外部材质', '苦荞麦']
# ['精品三姐妹硬糕', '口味', '原味硬糕850克【10包40块糕】']
模型参考并修改了OpenKE中的实现。
- 编译C++代码
cd 模型目录
bash scripts/make.sh
- 数据预处理
bash scripts/prepro.sh
- 训练模型并预测结果,结果保存在
./results/result.tsv
bash scripts/train.sh
模型参考并修改了TuckER中的实现。
- 数据预处理
bash scripts/prepro.sh
- 训练模型并预测结果,结果保存在
./results/result.tsv
bash scripts/train.sh
此代码参考了以下代码: