2014-09-28 2 views
0

Я пытаюсь взять набор строк, разметить Струны на отдельные символы, и перестроить их в формат JSON с целью здания визуализации кластера дендрограммы (вроде как this word tree, для строк, за исключением вместо предложений). Таким образом, бывают случаи, когда последовательность символов разделяется (или публикуется) по данным.Структурирование Plain Text в формат JSON

Так, например, позволяет сказать, что у меня есть текстовый файл, который выглядит следующим образом:

xin_qn2 
x_qing4n3 
x_qing4nian_ 

Это все я предвижу для моего входа; нет заголовков CSV или чего-либо, связанного с данными. Объект JSON будет выглядеть примерно так:

{ 
    "name": "x", 
    "children": [ 
     { 
      "name": i, 
     }, 
     { 
      "name": _, 
      "children": [ 
       { 
        "name": "q" 
       } 
      ] 
     } 
    ] 
} 

И так далее. Я пытался структурировать данные раньше времени, прежде чем отправлять его на D3.js, используя Ruby, чтобы разделить строки на отдельные символы, но я застрял, пытаясь понять, как структурировать это в иерархическом JSON.

file_contents = File.open("single.txt", "r") 

file_contents.readlines.each do |line| 
    parse = line.scan(/[A-Za-z][^A-Za-z]*/) 
    puts parse 
end 

Я мог бы сделать это в браузере с помощью d3.js вместо этого, я просто еще не пробовал.

Просто интересно, есть ли какие-либо предложения, указатели или существующие инструменты/скрипты, которые могут мне помочь. Благодаря!

Обновление 2014-10-02

Так я провел немного времени, пытаясь это в Python, но я продолжаю застревать. Я также не обращаю внимание на элементы «детей». Какие-либо предложения?

Покушение Один

#!/usr/bin/python 

from collections import defaultdict 
import json 

def tree(): 
    return defaultdict(tree) 

file_out = open('out.txt', 'wb') 

nested = defaultdict(tree) 

with open("single.txt") as f: 
    for line in f: 
     o = list(line) 
     char_lst = [] 
     for chars in o: 
      d = {} 
      d['name']=chars 
      char_lst.append(d) 
     for word in d: 
      node = nested 
      for char in word: 
       node = node[char.lower()] 
       print node 

print(json.dumps(nested)) 

Покушение Два

#!/usr/bin/python 

from collections import defaultdict 
import json 

def tree(): 
    return defaultdict(tree) 

nested = defaultdict(tree) 

words = list(open("single.txt")) 
words_output = open("out.json", "wb") 

for word in words: 
    node = nested 
    for char in word: 
     node = node[char.lower()] 

def print_nested(d, indent=0): 
    for k, v in d.iteritems(): 
    print '{}{!r}:'.format(indent * ' ', k) 
    print_nested(v, indent + 1) 

print_nested(nested) 
+0

Вам нужно создать кучу словарей, а затем сохранить их в списках. Я не могу сказать о Ruby, но Python делает это очень просто. –

ответ

1

Вы почти там с 2 попытки #. Добавление json.dumps(nested) до конца напечатает следующий JSON:

{ 
    "x":{ 
    "i":{ 
     "n":{ 
     "_":{ 
      "q":{ 
      "n":{ 
       "2":{ 

       } 
      } 
      } 
     } 
     } 
    }, 
    "_":{ 
     "q":{ 
     "i":{ 
      "n":{ 
      "g":{ 
       "4":{ 
       "n":{ 
        "i":{ 
        "a":{ 
         "n":{ 
         "_":{ 

         } 
         } 
        } 
        }, 
        "3":{ 

        } 
       } 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 

близко, но не совсем то, что вы хотите. Кстати, вы также можете преобразовать вложенную defaultdict в обычный Dict с помощью следующей функции:

def convert(d): 
    return dict((key, convert(value)) for (key,value) in d.iteritems()) if isinstance(d, defaultdict) else d 

Но мы до сих пор только у Dict из dicts (из dicts ...).Используя рекурсию, мы можем преобразовать его в требуемый формат следующим образом:

def format(d): 
    children = [] 
    for (key, value) in d.iteritems(): 
     children += [{"name":key, "children":format(value)}] 
    return children 

Наконец, давайте распечатать JSON:

print json.dumps(format(convert(nested))) 

Это печатает следующий JSON (отформатированный для наглядности):

[ 
    { 
    "name":"x", 
    "children":[ 
     { 
     "name":"i", 
     "children":[ 
      { 
      "name":"n", 
      "children":[ 
       { 
       "name":"_", 
       "children":[ 
        { 
        "name":"q", 
        "children":[ 
         { 
         "name":"n", 
         "children":[ 
          { 
          "name":"2", 
          "children":[ 

          ] 
          } 
         ] 
         } 
        ] 
        } 
       ] 
       } 
      ] 
      } 
     ] 
     }, 
     { 
     "name":"_", 
     "children":[ 
      { 
      "name":"q", 
      "children":[ 
       { 
       "name":"i", 
       "children":[ 
        { 
        "name":"n", 
        "children":[ 
         { 
         "name":"g", 
         "children":[ 
          { 
          "name":"4", 
          "children":[ 
           { 
           "name":"n", 
           "children":[ 
            { 
            "name":"i", 
            "children":[ 
             { 
             "name":"a", 
             "children":[ 
              { 
              "name":"n", 
              "children":[ 
               { 
               "name":"_", 
               "children":[ 

               ] 
               } 
              ] 
              } 
             ] 
             } 
            ] 
            }, 
            { 
            "name":"3", 
            "children":[ 

            ] 
            } 
           ] 
           } 
          ] 
          } 
         ] 
         } 
        ] 
        } 
       ] 
       } 
      ] 
      } 
     ] 
     } 
    ] 
    } 
] 

Вот полный код:

#!/usr/bin/python 

from collections import defaultdict 
import json 

def tree(): 
    return defaultdict(tree) 

nested = defaultdict(tree) 

words = open("single.txt").read().splitlines() 
words_output = open("out.json", "wb") 

for word in words: 
    node = nested 
    for char in word: 
     node = node[char.lower()] 

def convert(d): 
    return dict((key, convert(value)) for (key,value) in d.iteritems()) if isinstance(d, defaultdict) else d 

def format(d): 
    children = [] 
    for (key, value) in d.iteritems(): 
     children += [{"name":key, "children":format(value)}] 
    return children 

print json.dumps(format(convert(nested))) 
+0

Спасибо, OrionMelt! Это потрясающе. Очень признателен. –