我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

在构建知识图谱的过程中,在把数据最终写入neo4j数据库之前,苏南大叔生成了一个三元组文本文件。这个文本文件就是由一行一行的普通文本所组成的。那么,在这些数据中,是存在着一些重复数据的,那么问题来了,这些文本数据如何去重?

苏南大叔:python如何给文本数据去重?知识图谱三元组数据去重 - python文本去重
python如何给文本数据去重?知识图谱三元组数据去重(图2-1)

大家好,这里是苏南大叔的“程序如此灵动”博客,这里讲述一些计算机代码的事情。本文测试环境:python@3.6.8。本文主要描述的内容是:python文本去重逻辑。

基本情况

下面的是用于操作的文本范例。

苏南大叔:python如何给文本数据去重?知识图谱三元组数据去重 - 待处理文本数据范例
python如何给文本数据去重?知识图谱三元组数据去重(图2-2)

如果不考虑三元组的特殊逻辑的话,这里的去重代码如下所示:

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,可以快速判断数据是否存在。
  • 据说setlist效率高。
  • set是无序的,不能使用索引号访问。list则是有序的,可以使用索引号访问。

下面再写个setlist的对比

_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相关文章,请点击:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   python