【问题标题】:Parsing a json file to pandas dataframe将 json 文件解析为 pandas 数据框
【发布时间】:2020-01-24 03:43:32
【问题描述】:

我需要将一些 json 文件解析为 pandas 数据框。我希望有一列包含文本中存在的单词,另一列包含相应的实体——实体将是下面文本的“类型”,当“值”对应于单词时,否则我想分配标签“O”。

下面是一个例子。 这是 JSON 文件:

       {"Text": "I currently use a Netgear Nighthawk AC1900. I find it reliable.",
        "Entities": [
        {
            "Type": "ORGANIZATION ", 
            "Value": "Netgear"
        }, 
        {
            "Type": "DEVICE ", 
            "Value": "Nighthawk AC1900"
        }]
       }

这是我想要的:

              WORD                TAG
              I                    O
              currently            O
              use                  O
              a                    O
              Netgear              ORGANIZATION
              Nighthawk AC1900     DEVICE
              .                    O
              I                    O
              find                 O
              it                   O
              reliable             O
              .                    O

有人可以帮我解析吗?我不能使用 split() 因为有时值由两个单词组成。希望这很清楚。谢谢!

【问题讨论】:

    标签: python json pandas parsing


    【解决方案1】:

    我不知道您是否需要严格地发布为所需输出的内容。 我给你的解决方案是“脏”(更多元素和列 TAG 放在第一位) 您可以设法清理它并将其放入您需要的格式。由于您没有提供一段代码来开始,您可以完成它。 最终你会发现 stackoverflow 的目的不是让人们为你编写代码,而是让人们帮助你编写你正在尝试的代码。

    import json
    import pandas as pd
    
    #open and reading of the json:
    with open('netgear.json','r') as jfile:
       data = jfile.read()
    
    info = json.loads(data)
    
    #json into content 
    words,tags = info['Text'].split(),info['Entities']
    
    #list to handle the Entities
    prelist = []
    
    for i in tags:
    
        j = list(i.values())
        #['ORGANIZATION ', 'Netgear']
        #['DEVICE ', 'Nighthawk AC1900']    
    
        prelist.append(j)
    
    #DataFrames to be merged
    dft = pd.DataFrame(prelist,columns=['TAG','WORD'])  
    dfw = pd.DataFrame(words,columns=['WORD'])  
    
    #combine the dataFrames and NaN into 0
    df = dfw.merge(dft, on='WORD', how='outer').fillna(0)
    

    这是输出:

                     WORD            TAG
    0                  I              0
    1                  I              0
    2          currently              0
    3                use              0
    4                  a              0
    5            Netgear  ORGANIZATION 
    6          Nighthawk              0
    7            AC1900.              0
    8               find              0
    9                 it              0
    10         reliable.              0
    11  Nighthawk AC1900        DEVICE 
    

    【讨论】:

    • 很高兴听到。如果可以的话,请对我的解决方案投赞成票。
    【解决方案2】:

    这是一个难题,取决于此示例中没有哪些数据以及所需的输出。实体值中是否有重复数据?顺序重要吗?您想在输出中重复吗?

    有几个工具可以使用:

    • make a trie 在搜索字符串之前取出实体值。如果您有相同名称的重叠版本,例如“Netgear”和“Netgear INC”,这很好。你想要最长的版本。
    • nltk.PunktSentenceTokenizer 这个关于名词的工作很挑剔。本教程更好地解释了如何处理它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多