Как получить словарь из столбцов в фрейме данных?

У меня есть довольно большой набор данных, хранящийся в фрейме данных. На самом деле настолько большой, что сортировка набора данных для создания примера набора данных привела к сбою моего текстового редактора. По этой причине я даю ссылки на наборы данных, которые я использую:

https://github.com/moonman239/Capstone-project/blob/master/data.zip

В целях планирования мне нужно получить словарный запас слов из столбцов question, article_title и параграф_context.

Однако оказалось, что в процессе разделения и объединения столбцов я непреднамеренно создал несколько слов, соединив два слова встык (например, «поднятый» и «в» стали «поднятыми» на каталонском языке)

### Loading JSON datasets

import json
import re
regex = re.compile(r'\W+')
def readFile(filename):
  with open(filename) as file:
    fields = []
    JSON = json.loads(file.read())
    for article in JSON["data"]:
      articleTitle = article["title"]
      for paragraph in article["paragraphs"]:
        paragraphContext = paragraph["context"]
        for qas in paragraph["qas"]:
          question = qas["question"]
          for answer in qas["answers"]:
            fields.append({"question":question,"answer_text":answer["text"],"answer_start":answer["answer_start"],"paragraph_context":paragraphContext,"article_title":articleTitle})
  fields = pd.DataFrame(fields)
  fields["question"] = fields["question"].str.replace(regex," ")
  assert not (fields["question"].str.contains("catalanswhat").any())
  fields["paragraph_context"] = fields["paragraph_context"].str.replace(regex," ")
  fields["answer_text"] = fields["answer_text"].str.replace(regex," ")
  assert not (fields["answer_text"].str.contains("catalanswhat").any())
  fields["article_title"] = fields["article_title"].str.replace("_"," ")
  assert not (fields["article_title"].str.contains("catalanswhat").any())
  return fields
# Load training dataset.
trainingData = readFile("train-v1.1.json")

# Vocabulary functions
def vocabulary():
  data_frame = trainingData
  data_frame = data_frame.astype("str")
  text_split = pd.concat((data_frame["question"],data_frame["paragraph_context"],data_frame["article_title"]),ignore_index=True)
  text_split = text_split.str.split()
  words = set()
  text_split.apply(words.update)
  return words
def vocabularySize():
  return len(vocabulary())

Альтернативный код, который также не работает:

def vocabulary():
  data_frame = trainingData
  data_frame = data_frame.astype("str")
  concat = data_frame["question"].str.cat(sep = " ",others=[data_frame["paragraph_context"],data_frame["article_title"]])
  concat = concat.str.split(" ")
  words = set()
  concat.apply(words.update)
  print(words)
  assert "raisedin" not in words
  return words

Попробуйте предоставить минимальный, воспроизводимый, полный пример. У нас нет доступа к вашему хорошему диску, так что этот кусок кода бесполезен. У нас нет доступа к данным json, так что это тоже бесполезно. И т.п.

James 30.05.2019 02:23

@Джеймс: отмечено. Я загрузил MCVE и ссылку на один из моих наборов данных.

Montana Burr 30.05.2019 02:35
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
1 697
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это мой подход к проблеме:

from sklearn.feature_extraction.text import CountVectorizer

df = pd.read_json('train-v1.1.json')

words = []
for idx, row in df.iterrows():
    #title
    words.append(json_normalize(df['data'][idx])['title'].str.replace("_"," ").to_string(index = False))
    #paragraph context
    words.append(json_normalize(df['data'][idx], record_path = 'paragraphs')['context'].to_string(index = False))
    #question
    words.append(json_normalize(df['data'][idx], record_path = ['paragraphs', 'qas'])['question'].to_string(index = False))


vectorizer = CountVectorizer()
count = vectorizer.fit_transform(words)
vectorizer.get_feature_names()

У sklearn есть функция, которая буквально делает то, что вы хотите сделать, получить все отдельные слова для набора данных. Чтобы использовать это, нам нужно поместить все данные в 1 список или серию.

Как мы достигаем создания списка, сначала читаем в файле. Я заметил, что внутри встроено много json-файлов, поэтому далее мы собираемся перебрать все различные json-файлы и извлечь нужные данные, а затем добавить их в список под названием words.

Как мы извлекаем необходимую информацию из следующего:

json_normalize(df['data'][idx], record_path = ['paragraphs', 'qas'])['question'].to_string(index = False)

Мы смотрим на столбец данных нашего df, который содержит отдельные jsons. Мы перемещаемся по json, пока не окажемся в точке, в которой мы хотим быть через record_path. Затем мы берем нужный столбец, преобразуем его все в строки, а затем добавляем новый список к нашему основному списку слов. Мы делаем это для всех разных файлов json.

Если вы хотите выполнить какие-либо другие манипуляции со строками (например, удалить «_» вместо «»), вы можете сделать это в цикле for или со списком основных слов. Я сделал это только для титулов в моем случае.

Наконец, мы собираемся сложить слова. Мы создаем CountVectorizer, называемый векторизатором, подгоняем и трансформируем наш список. Наконец, мы можем исследовать наш CountVectorizer с помощью функции get_feature_names(), чтобы увидеть каждое слово. Обратите внимание, если в тексте есть орфографические ошибки, они тоже будут.

РЕДАКТИРОВАТЬ:

Вы можете использовать приведенный ниже код для поиска слов и посмотреть, где они находятся. Измените значения в проверке на то, что вы хотите.

df = pd.read_json('train-v1.1.json')

vectorizer = CountVectorizer()
checking = ['raisedin']

for idx, row in df.iterrows():
    title = []
    para = []
    quest = []

    getTitle = json_normalize(df['data'][idx])['title'].str.replace("_"," ")
    getPara = json_normalize(df['data'][idx], record_path = 'paragraphs')['context']
    getQuest = json_normalize(df['data'][idx], record_path = ['paragraphs', 'qas'])['question']

    title.append(getTitle.str.replace("_"," ").to_string(index = False))
    para.append(getPara.to_string(index = False))
    quest.append(getQuest.to_string(index = False))

    for word in checking:
        for allwords in [getTitle, getPara, getQuest]:
            count = vectorizer.fit_transform(allwords)
            test = vectorizer.get_feature_names()
            if word in test:
                print(getTitle)
                print(f"{word} is in: " +  allwords.loc[allwords.str.contains(word)])

0    Poultry
Name: title, dtype: object
93    raisedin is in: How long does it take for an broiler raisedin...
Name: question, dtype: object

Спасибо за помощь. Это не решило проблему, но теперь я лучше понимаю, в чем проблема, и она должна быть до словарной функции.

Montana Burr 31.05.2019 06:26

Итак, я еще немного покопался для вас, и это не ваш код, это текст. Например, вопрос 93 json под названием «Птица» содержит слово «выращенный», откуда вы его взяли. В нем говорится: «Сколько времени требуется для выращивания бройлеров ...». Вы просто должны осознавать тот факт, что с реальными данными случаются орфографические ошибки и пропущенные пробелы.

Ben Pap 31.05.2019 09:32

Другие вопросы по теме

Как извлечь значение из фрейма данных Pandas из ссылки во фрейме, а затем «подняться» по фрейму до другого указанного значения?
У меня есть DF с 2 столбцами. Я хочу сделать логическую проверку
Как я могу разделить список слов, разделенных запятыми, в столбце Pandas?
Перечислите все возможные комбинации значений фрейма данных pandas для достижения определенной суммы
Большой (6 миллионов строк) pandas df вызывает ошибку памяти с `to_sql`, когда размер фрагмента = 100, но может легко сохранить файл размером 100 000 без размера фрагмента
Возвращение местоположения первого значения в местоположении фрейма данных, которое соответствует условию в фрейме данных pandas
Разобрать этот файл CSV и создать без использования Pandas?
Не могу понять, как правильно реализовать оператор if в фрейме данных с применением лямбда
Как выбрать значение из DataFrame (даже если записи нет)
Как отображать данные в час, сгруппированные по дням?

Похожие вопросы