Я относительно новичок в Google Cloud Platform. У меня есть большой набор данных (18 миллионов статей). Мне нужно провести анализ настроения объекта с помощью NLP-API GCP. Я не уверен, является ли способ, которым я проводил свой анализ, наиболее оптимальным с точки зрения времени, которое требуется, чтобы получить чувство сущности для всех статей. Интересно, есть ли способ пакетной обработки всех этих статей вместо итерации каждой из них и выполнения вызова API. Вот краткое описание процесса, который я использовал.
- У меня около 500 файлов, каждый из которых содержит около 30 000 статей.
- Используя скрипт python на моем локальном сервере, яперебирая каждый файл и для каждой статьи я вызываю функцию, указанную здесь
- Я сохраняю весь вывод для каждой статьи в protobuf.
После этого шага мне не требуется API Google, и я выполняю окончательный анализ вывода API, хранящегося в protobufs.
Это сработало достаточно для исследовательского проекта, где у меня было около 1,5 миллиона статей и заняло несколько дней. Теперь, когда у меня есть 18 миллионов статей, мне интересно, есть ли лучший способ сделать это. Статьи, которые я читал о пакетной обработке, направлены на создание приложений или задач обработки изображений. Было что-то вроде того, что я хотел здесь , но я не уверен, смогу ли я сделать это с помощью NLP-API.
Это фрагмент моего кода, а DF - это фрейм данных Pandas, гдеУ меня есть свои статьи.
def entity_sentiment_text(text):
"""Detects entity sentiment in the provided text."""
if isinstance(text, six.binary_type):
text = text.decode('utf-8')
document = types.Document(
content=text.encode('utf-8'),
type=enums.Document.Type.PLAIN_TEXT)
# Detect and send native Python encoding to receive correct word offsets.
encoding = enums.EncodingType.UTF32
if sys.maxunicode == 65535:
encoding = enums.EncodingType.UTF16
result = client.analyze_entity_sentiment(document, encoding)
return result
for i,id_val in enumerate(article_ids):
loop_start = time.time()
if i%100 == 0:
print i
# create dynamic name, like "D:\Current Download\Attachment82673"
dynamic_folder_name = os.path.join(folder, str(i))
# create 'dynamic' dir, if it does not exist
if not os.path.exists(dynamic_folder_name):
os.makedirs(dynamic_folder_name)
file_name = str(id_val) + ".txt"
text = list(DF.loc[id_val])[1]
try:
text = unicode(text, errors='ignore')
result = entity_sentiment_text(text)
# print result
with open(dynamic_folder_name + "/" + str(id_val) + ".bin", 'w') as result_file:
result_file.write(result.SerializeToString())
result_file.close()
except Exception as e:
print(e)
with open("../"article_id_error.log", "a") as error_file:
error_file.write(json.dumps(str(id_val) + "\n"))
log_exception(e,id_val)
Обратите внимание, что это разовый анализ для исследования, и я не создаю приложение. Я также знаю, что не могу уменьшить количество обращений к API. Таким образом, если я делаю 18 миллионов вызовов, каков самый быстрый способ сделать все эти вызовы вместо того, чтобы проходить каждую статью и вызывать функцию по отдельности?
Я чувствую, что должен провести какую-то параллельобработки, но я немного опасаюсь тратить больше времени на изучение Dataproc, не зная, поможет ли это мне в решении моей проблемы.