Красивый суп, XML в кадр данных Pandas

avatar
Tasfiq.Asif
8 августа 2021 в 15:46
83
1
0

Я новичок в машинном обучении и изучении базы данных для моего проекта nlp. здесь я получил данные из http://www.cs.jhu.edu/~mdredze/datasets/sentiment/index2.html. и я пытаюсь создать кадр данных pd, в котором я хочу проанализировать данные xml, я также хочу добавить метку (1) к положительным отзывам. Может кто-нибудь, пожалуйста, помогите мне с кодом, образец вывода был предоставлен,

from bs4 import BeautifulSoup
positive_reviews = BeautifulSoup(open('/content/drive/MyDrive/sorted_data_acl/electronics/positive.review', encoding='utf-8').read())
positive_reviews = positive_reviews.findAll('review_text')
positive_reviews[0]



<review_text>
I purchased this unit due to frequent blackouts in my area and 2 power supplies going bad.  It will run my cable modem, router, PC, and LCD monitor for 5 minutes.  This is more than enough time to save work and shut down.   Equally important, I know that my electronics are receiving clean power.

I feel that this investment is minor compared to the loss of valuable data or the failure of equipment due to a power spike or an irregular power supply.

As always, Amazon had it to me in &lt;2 business days
</review_text>
Источник

Ответы (1)

avatar
Rob Raymond
8 августа 2021 в 18:50
1
  • основная проблема заключается в примечании, что это псевдо XML
  • загрузить файл tar.gz и разархивировать/распаковать
  • построить словарь из всех файлов
  • обходной путь для работы с псевдо XML - вставить элемент документа в строковое представление документа
  • затем простой случай использования пониманий списка/слова для создания панд конструктора формата
  • dfs — словарь фреймов данных, готовый к использованию
import requests
from pathlib import Path
from tarfile import TarFile
from bs4 import BeautifulSoup
import io
import pandas as pd

# download tar with psuedo XML...
url = "http://www.cs.jhu.edu/%7Emdredze/datasets/sentiment/domain_sentiment_data.tar.gz"
fn = Path.cwd().joinpath(url.split("/")[-1])
if not fn.exists():
    r = requests.get(url, stream=True)
    with open(fn, 'wb') as f:
        for chunk in r.raw.stream(1024, decode_content=False):
            if chunk:
                f.write(chunk)

# untar downloaded file and generate a dictionary of all files
TarFile.open(fn, "r:gz").extractall()
files = {f"{p.parent.name}/{p.name}":p for p in Path.cwd().joinpath("sorted_data_acl").glob("**/*") if p.is_file()}

# convert all files into dataframes in a dict
dfs = {}
for file in files.keys():
    with open(files[file]) as f: text = f.read()
    # psuedo xml where there is not root element stops it from being well formed
    # force it in...
    soup = BeautifulSoup(f"<root>{text}</root>", "xml")
    # simple case of each review is a row and each child element is a column
    dfs[file] = pd.DataFrame([{c.name:c.text.strip("\n") for c in r.children if c.name} for r in soup.find_all("review")])
Tasfiq.Asif
9 августа 2021 в 10:11
0

Большое спасибо! Это сработало. Хотя код для меня немного сложен :D. Поскольку я еще не знаком с модулем pathlib. но большое спасибо за ваше время. :)

Rob Raymond
9 августа 2021 в 11:49
0

ключевой частью решения является вставка элемента документа, чтобы сделать XML правильно сформированным. использование pathlib просто заставляет компьютер выполнять работу по управлению файлами :-)