У меня есть довольно большой набор данных, хранящийся в фрейме данных. На самом деле настолько большой, что сортировка набора данных для создания примера набора данных привела к сбою моего текстового редактора. По этой причине я даю ссылки на наборы данных, которые я использую:
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
@Джеймс: отмечено. Я загрузил MCVE и ссылку на один из моих наборов данных.
Это мой подход к проблеме:
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
Спасибо за помощь. Это не решило проблему, но теперь я лучше понимаю, в чем проблема, и она должна быть до словарной функции.
Итак, я еще немного покопался для вас, и это не ваш код, это текст. Например, вопрос 93 json под названием «Птица» содержит слово «выращенный», откуда вы его взяли. В нем говорится: «Сколько времени требуется для выращивания бройлеров ...». Вы просто должны осознавать тот факт, что с реальными данными случаются орфографические ошибки и пропущенные пробелы.
Попробуйте предоставить минимальный, воспроизводимый, полный пример. У нас нет доступа к вашему хорошему диску, так что этот кусок кода бесполезен. У нас нет доступа к данным json, так что это тоже бесполезно. И т.п.