【问题标题】:How to remove not useful elements from a dataset如何从数据集中删除无用元素
【发布时间】:2019-07-29 05:39:57
【问题描述】:

我有一个数据集,如下所示:

 {0: {"address": 0,
         "ctag": "TOP",
         "deps": defaultdict(<class "list">, {"ROOT": [6, 51]}),
         "feats": "",
         "head": "",
         "lemma": "",
         "rel": "",
         "tag": "TOP",
         "word": ""},
     1: {"address": 1,
         "ctag": "Ne",
         "deps": defaultdict(<class "list">, {"NPOSTMOD": [2]}),
         "feats": "_",
         "head": 6,
         "lemma": "اشرف",
         "rel": "SBJ",
         "tag": "Ne",
         "word": "اشرف"},

我想从此数据集中删除 "deps":...?。我尝试了这段代码但不起作用,因为"depts": 的值在字典的每个元素中都不同。

import re
import simplejson as simplejson

with open("../data/cleaned.txt", 'r') as fp:
    lines = fp.readlines()
    k = str(lines)
    a = re.sub(r'\d:', '', k) # this is for removing numbers like `1:{..`
    json_data = simplejson.dumps(a)
    #print(json_data)
    n = eval(k.replace('defaultdict(<class "list">', 'list'))
    print(n)

【问题讨论】:

  • 尝试将整个json加载到字典中,而不是使用json.dumps()然后pop这个键。
  • 这是无效的 Json。您是如何生成包含该内容的 text 文件的?
  • @SergeBallesta,我使用了依赖解析器,它会生成这些数据,我想调整为 JSON 格式,但是如何?
  • @SergeBallesta,你为什么要删除你的解决方案?
  • 我无法重现您在 cmets 中显示的行为,因此我认为答案没有帮助。我当然可以取消删除它,但我真的认为这是一个XY Problem...

标签: python json preprocessor


【解决方案1】:

正确的方法是修复生成文本文件的代码。这个defaultdict(&lt;class "list"&gt;, {"ROOT": [6, 51]}) 暗示它在需要更智能的格式时使用了简单的repr

如果无法真正解决,以下只是一个穷人的解决方法。

摆脱"deps": ... 很容易:一次读取一行文件并丢弃任何以""deps" 开头的文件就足够了(忽略初始空格)。但这还不够,因为当 json 坚持键只是文本时,文件包含数字键。所以数字键必须被识别和引用。

这可能允许加载文件:

重新导入 将 simplejson 导入为 simplejson

with open("../data/cleaned.txt", 'r') as fp:
    k = ''.join(re.sub(r'(?<!\w)(\d+)', r'"\1"',line)
        for line in fp if not line.strip().startswith('"deps"'))

# remove an eventual last comma
k = re.sub(r',[\s\n]*$', '', k, re.DOTALL)

# uncomment if the file does not contain the last }
# k += '}'

js = json.loads(k)

【讨论】:

  • 感谢您的帮助,但它给出了这个错误,json.decoder.JSONDecodeError: Expecting ':' delimiter: line 1 column 15 (char 14),即使我在正则表达式中包含了':',但仍然是这个错误。你知道怎么回事吗?
  • @user2988094:无法复制。你能在使用loads 之前展示给print(repr(k[:20])) 的内容吗?
  • 它给我的第一行是这样的:' [ {""0"": ' 如果我使用print(repr(k[:])) 给我所有的输出,但不是在 odered。
  • [ 来自哪里?你怎么能和我的代码有线条?
  • 在加入前将其从各个行中删除:k = ''.join(re.sub(r'(?&lt;!\w)(\d+)', r'"\1"',line.rstrip()) for line in fp if not line.strip().startswith('"deps"'))。我留下它们是因为它们在 Json 字符串中是无害的。
【解决方案2】:

试试

import json
with open("../data/cleaned.txt", 'r') as fp:
    data = json.load(fp)
    for key, value in data.items():
        value.pop("deps", None)

现在您将获得不含deps 的数据。如果您想将记录转储到新文件中

json.dump(data, "output.json")

【讨论】:

  • 您分享的代码给了我两个错误。首先,如果我在数据集中包含"deps": defaultdict(&lt;class "list"&gt;, {"NPOSTMOD": [2]}),则会在:defaultdict(&lt;class "list"&gt;, 上出现错误,如果我删除这部分,则会出现以下错误:AttributeError: 'list' object has no attribute 'items'
【解决方案3】:

怎么样

#!/usr/bin/env python
# -*- coding: utf-8 -*-

data = {0: {"address": 0,
            "ctag": "TOP",
            "deps": 'something',
            "feats": "",
            "head": "",
            "lemma": "",
            "rel": "",
            "tag": "TOP",
            "word": ""},
        1: {"address": 1,
            "ctag": "Ne",
            "deps": 'something',
            "feats": "_",
            "head": 6,
            "lemma": "اشرف",
            "rel": "SBJ",
            "tag": "Ne",
            "word": "اشرف"}}

for value in data.values():
    if 'deps' in value:
        del value['deps']

【讨论】:

  • 您编辑了数据集"depts": 'something',实际外观为"deps": defaultdict(&lt;class "list"&gt;, {"ROOT": [6, 51]}),,您的代码适用于编辑后的数据集,但实际情况并非如此。如何用实际解决,当我在实际数据集上使用你的代码时,它给了我这个错误:json.decoder.JSONDecodeError: Expecting value: line 5 column 26 (char 107) 指向dept
  • 如何创建数据。你能分享cleaned.txt吗?
  • 在将数据写入磁盘(如 'cleaned.txt' )之前,'deps' 字段应转换为 dict。 data['deps'] = dict(data['deps'])
  • 我使用依赖解析器来解析文本,然后我想对 Dari 文本进行关系提取。现在,解析器创建了这个文本,正如您在帖子中看到的那样,但我必须将其更改为 JSON 格式才能访问每个元素,然后进行分类。怎么做,是个问题
  • 您是否可以控制编写“cleaned.txt”的代码?如果你这样做 - 请参阅我上面的评论。在解析器写入磁盘之前 - 应该修改 deps
猜你喜欢
  • 2015-03-05
  • 1970-01-01
  • 2011-02-06
  • 2018-10-17
  • 2012-09-29
  • 2017-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多