python如何给文本数据去重?知识图谱三元组数据去重
发布于 作者:苏南大叔 来源:程序如此灵动~ 我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...
在构建知识图谱的过程中,在把数据最终写入neo4j
数据库之前,苏南大叔生成了一个三元组文本文件。这个文本文件就是由一行一行的普通文本所组成的。那么,在这些数据中,是存在着一些重复数据的,那么问题来了,这些文本数据如何去重?
大家好,这里是苏南大叔的“程序如此灵动”博客,这里讲述一些计算机代码的事情。本文测试环境:python@3.6.8
。本文主要描述的内容是:python
文本去重逻辑。
基本情况
下面的是用于操作的文本范例。
如果不考虑三元组的特殊逻辑的话,这里的去重代码如下所示:
source_file = "test.txt"
out_file = "test2.txt"
ok_set = set()
o = open(out_file, "w",encoding="utf-8")
f = open(source_file, "r",encoding="utf-8")
for line in f:
# aaa bbb ccc
if line not in ok_set:
ok_set.add(line)
o.write(line)
o.close()
这里,因为苏南大叔处理的是知识图谱的三元组数据,根据该领域数据的特殊性,“一个实体”和“一个关系”,只能对应另外一个实体,而不能对应两个或更多。因此,苏南大叔做了另外一个set()
,用于做这部分数据的去重。
source_file = "test.txt"
out_file = "test2.txt"
ok_set = set()
ok_set_part = set()
o = open(out_file, "w",encoding="utf-8")
f = open(source_file, "r",encoding="utf-8")
for line in f:
# aaa bbb ccc
if line not in ok_set:
ok_set.add(line)
tmp_arr = line.split('\t')
line_part = ('\t').join(tmp_arr[slice(2)]).strip()
if line_part not in ok_set_part:
o.write(line)
ok_set_part.add(line_part)
o.close()
核心语句
# ...
ok_set = set()
# ...
for line in f:
if line not in ok_set:
# ...
为啥这里使用set()
没有使用[]
呢?因为:
set
有一个非常好用的操作in
,可以快速判断数据是否存在。- 据说
set
比list
效率高。 set
是无序的,不能使用索引号访问。list
则是有序的,可以使用索引号访问。
下面再写个set
和list
的对比
_list = ["a",1,"a"]
_set = set(["a",1,"a"])
print (_list[0]) # a
print (_set[0]) # TypeError: 'set' object does not support indexing
可以看到set
的定义就是在list
外边包了一个括号。一下子有序就变无序了,就可以使用in
操作符了。
参考文献
总结
本文的去重原理非常简单,就是预先设置了一个集合,如果文本在这个集合中,就证明已经出现过,放入抛弃逻辑,否则进入保存到集合的逻辑。
更多python
相关文章,请点击:
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。