Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 6, 2014 00:28:55

dshubenok
Зарегистрирован: 2014-12-06
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Перевести атрибуты элементов из XML в SCV.

Здравствуйте!
/
Есть документ в формате XML с большим количеством данных, который содержит атрибуты элементов, примерно вот так:
<aspect category=“Whole” from=“71” mark=“Rel” sentiment=“neutral” term=“ресторане” to=“80” type=“explicit”/>
Необходимо удалить все атрибуты to= и from=, а остальные перевести в табличку csv. Как-то так чтобы это выглядело в итоге:

term | category | sentiment | mark | type
ресторане |Whole | neutral | Rel | explicit

Помогите, пожалуйста.

Отредактировано dshubenok (Фев. 2, 2015 12:43:16)

Офлайн

#2 Дек. 7, 2014 02:22:39

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Перевести атрибуты элементов из XML в SCV.

кусочек файла скиньте



————————————————
-*- Simple is better than complex -*-

Офлайн

#3 Дек. 7, 2014 05:17:51

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Перевести атрибуты элементов из XML в SCV.

Как-то так:

import csv
import xml.etree.cElementTree as ET
xml = ET.parse("xml_file_name")
columns = []
with open("result.csv", "wt", encoding="utf-8", newline="") as fout:
    writer = csv.writer(fout, delimiter="|")
    for node in xml.findall("aspect"):
        if not columns:
            columns = [key for key in node.attrib if key not in ("from", "to")]
            writer.writerow(columns)
       writer.writerow(node.get(key) for key in columns)



Отредактировано pyuser (Дек. 7, 2014 05:18:28)

Офлайн

#4 Дек. 7, 2014 22:09:44

dshubenok
Зарегистрирован: 2014-12-06
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Перевести атрибуты элементов из XML в SCV.

pyuser
Как-то так:

Спасибо большое! А это для какой версии питона код?
У меня на третьей что-то не работает( Выдает “unexpected indent” для последней строки.

Офлайн

#5 Дек. 7, 2014 22:34:21

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Перевести атрибуты элементов из XML в SCV.

поставьте перед последней строкой один пробел

import csv
import xml.etree.cElementTree as ET
xml = ET.parse("xml_file_name")
columns = []
with open("result.csv", "wt", encoding="utf-8", newline="") as fout:
    writer = csv.writer(fout, delimiter="|")
    for node in xml.findall("aspect"):
        if not columns:
            columns = [key for key in node.attrib if key not in ("from", "to")]
            writer.writerow(columns)
        writer.writerow(node.get(key) for key in columns)



————————————————
-*- Simple is better than complex -*-

Офлайн

#6 Дек. 7, 2014 22:42:41

dshubenok
Зарегистрирован: 2014-12-06
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Перевести атрибуты элементов из XML в SCV.

На выход выдает result.csv размером 0 байт.
Прикрепил файл для преобразования.

Прикреплённый файлы:
attachment dialog.xml.zip (169,9 KБ)

Офлайн

#7 Дек. 7, 2014 23:26:28

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Перевести атрибуты элементов из XML в SCV.

import csv
import xml.etree.ElementTree as ET
xml = ET.parse("dialog.xml").getroot()
columns = []
with open("result.csv", "wt", encoding="utf-8", newline="") as fout:
    writer = csv.writer(fout, delimiter="|")
    for i in xml.findall("review"):
        for node in i.iter("aspect"):
            if not columns:
                columns = [key for key in node.attrib if key not in ("from", "to")]
                writer.writerow(columns)
            writer.writerow([node.get(key) for key in columns])



————————————————
-*- Simple is better than complex -*-

Офлайн

#8 Дек. 7, 2014 23:44:03

dshubenok
Зарегистрирован: 2014-12-06
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Перевести атрибуты элементов из XML в SCV.

Огромное спасибо!

Офлайн

#9 Дек. 9, 2014 23:56:19

dshubenok
Зарегистрирован: 2014-12-06
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Перевести атрибуты элементов из XML в SCV.

Снова обращаюсь к вам.

Что нужно допилить, чтобы для каждого термина (атрибута “term”) было указано, сколько раз он встречается с каждой из пяти категорией (атрибут “category”) вместе с одним из трех значений sentiment, нулевая встречаемость тоже учитывается. Например, так:
Food positive: 100 Food negative: 200 Food both: 10 Service positive: 0 Service positive 58 Service both: 0

Всего пять таких категорий (Service, Food, Interior, Price, Whole) и три значения (Positive, Negative, Both).
Слова (term) не нужно приводить к начальной форме, то есть термы “ресторан” и “ресторане” в данном случае должны выступать, как разные термы.

Офлайн

#10 Дек. 10, 2014 01:13:57

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Перевести атрибуты элементов из XML в SCV.

import csv
from collections import defaultdict
import xml.etree.ElementTree as ET
xml = ET.parse("dialog.xml").getroot()
result = defaultdict(lambda: {i: {'positive': 0, 'negative': 0, 'both': 0, 'neutral': 0} for i in ['Service', 'Food', 'Interior', 'Price', 'Whole']}, {})
for i in xml.findall("review"):
    for node in i.iter("aspect"):
        result[node.attrib['term']][node.attrib['category']][node.attrib['sentiment']] += 1
temp =  '\n\t%-10s: positive - %d; negative - %d; both - %d; neutral - %d'*5
for i in result.keys():
    a = []
    [[a.append(result[i][j][k] if k != None else j) for k in [None, 'positive', 'negative', 'both', 'neutral']] for j in ['Service', 'Food', 'Interior', 'Price', 'Whole']]
    print i,
    print temp % tuple(a)



————————————————
-*- Simple is better than complex -*-

Отредактировано terabayt (Дек. 10, 2014 01:15:32)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version