将json文件解析为熊猫数据框

时间:2019-09-24 04:34:49

标签: python json pandas parsing

我需要将一些json文件解析为熊猫数据框。我想有一栏中包含文字的单词,另一列包含相应的实体–当“值”对应于该单词时,该实体将是下面文字的“类型”,否则我想分配标签“ 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(),因为有时值包含两个单词。希望这很清楚。谢谢!

2 个答案:

答案 0 :(得分:0)

这是一个难题,将取决于此示例中未包含哪些数据以及所需的输出。实体值中是否有重复数据?订单重要吗?您要在输出中重复吗?

可以使用一些工具:

    在搜索字符串之前,请从实体值中选择
  • make a trie。如果您具有相同名称的重叠版本(例如“ Netgear”和“ Netgear INC”),则很好。而您想要最长的版本。
  • nltk.PunktSentenceTokenizer这与名词有关,是很挑剔的。本教程在解释如何处理它们方面做得更好。

答案 1 :(得分:0)

我不知道您所需要的是否严格是您作为所需输出发布的内容。 我给您的解决方案是“肮脏的”(更多元素,列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