Найти - Пользователи
Полная версия: Перевести атрибуты элементов из XML в SCV.
Начало » Центр помощи » Перевести атрибуты элементов из XML в SCV.
1
dshubenok
Здравствуйте!
/
Есть документ в формате 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

Помогите, пожалуйста.
terabayt
кусочек файла скиньте
pyuser
Как-то так:
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)
dshubenok
pyuser
Как-то так:

Спасибо большое! А это для какой версии питона код?
У меня на третьей что-то не работает( Выдает “unexpected indent” для последней строки.
terabayt
поставьте перед последней строкой один пробел
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)
dshubenok
На выход выдает result.csv размером 0 байт.
Прикрепил файл для преобразования.
terabayt
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])
dshubenok
Огромное спасибо!
dshubenok
Снова обращаюсь к вам.

Что нужно допилить, чтобы для каждого термина (атрибута “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) не нужно приводить к начальной форме, то есть термы “ресторан” и “ресторане” в данном случае должны выступать, как разные термы.
terabayt
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)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB