Nano Hash - криптовалюты, майнинг, программирование

Читайте текстовый файл быстрее в Python

У меня есть несколько текстовых файлов в папке. Общее количество текстовых файлов составляет 21941. Мой код хорошо работает для небольшого количества текстовых файлов, но когда я запускаю 5000 текстовых файлов, он застревает при чтении. Когда я запускаю свой код для полных данных, для чтения данных требуется 3 часа, но я все еще не могу закончить чтение всех данных. Пожалуйста, помогите мне, как я могу улучшить свой код или как я могу использовать GPU или многопроцессорность для этой задачи.

этот блок кода читает файл и возвращает ему список слов.

def wordList(doc):
    """
    1: Remove Punctuation
    2: Remove Stop Words
    3: return 
    """
    file = open("C:\\Users\\Zed\\PycharmProjects\\ACL txt\\"+doc, 'r', encoding="utf8", errors='ignore')
    text = file.read().strip()
    file.close()
    nopunc=[char for char in text if char not in string.punctuation]
    nopunc=''.join(nopunc)
    return [word for word in nopunc.split() if word.lower() not in stopwords.words('english')]

Этот блок кода читает имена файлов из папки

file_names=[]
for file in Path("ACL txt").rglob("*.txt"):
file_names.append(file.name)

И этот блок кода создает словарь со всеми документами. имя файла в качестве ключа и его содержимое в виде списка.

documents = {}
for i in file_names[:5000]:
documents[i]=wordList(i)

это ссылка набора данных

Моя системная спецификация - четырехъядерный процессор I7 с 16 ГБ оперативной памяти.

17.09.2019

  • Ваша самая большая проблема здесь: stopwords.words('english'). За пределами вашего понимания используйте english_stopwords = set(stopwords.words('english')), затем выполните: [word for word in nopunc.split() if word.lower() not in stopwords.words('english')]. Кроме того, вы также можете использовать punctuation = set(string.punctuation). Вы также не должны выполнять преобразование набора внутри функции, делайте это снаружи, даже если вы используете глобальную переменную. 17.09.2019
  • @juanpa.arrivillaga Я не уверен в реализации набора Python, но, учитывая, что существует около 10 знаков препинания, я бы ожидал, что линейный поиск в массиве пунктуации будет быстрее, чем поиск в любой обычной хеш-таблице. 17.09.2019
  • Я ожидаю, что преобразование из строки в список и обратно будет сильно тормозить производительность при вводе данных приличного размера. 17.09.2019
  • @SergeyA, ты удивишься. Линейный поиск начинает проигрывать хеш-набору на нескольких элементах в питоне, помните, это не примитивный массив, ну, под капотом это массив указателей PyObject... В любом случае, я засекал время, и хеш-набор выигрывает , 37.7 ns ± 0.422 ns для списка и 31.9 ns ± 0.282 для набора. 18.09.2019
  • @juanpa.arrivillaga спасибо, теперь все работает нормально, я загружаю все свои данные. Моя оперативная память сейчас используется 12 ГБ. 18.09.2019
  • @juanpa.arrivillaga Мой этот код застрял, как я могу улучшить этот код? #создать корпус, содержащий словарь слов в документах corpus = [] # список, в котором будут храниться слова словаря для документа в документах.значения(): #итерировать документы для слова в документе: #пройтись по каждому слову в текущий документ, если нет слова в корпусе: corpus.append(word) #добавить слово в корпус, если оно еще не добавлено 18.09.2019
  • @AkmalMasud Одна вещь, которую вы можете сделать, это сохранить свой словарный запас в наборе. Добавление слова в список становится дорогим по мере того, как список становится больше. Во-вторых, вместо преобразования в строку и обратно вы можете просто использовать re для удаления знаков препинания, таких как re.sub(f'[{string.punctuation}]', '', s) 18.09.2019
  • @juanpa.arrivillaga действительно интересно! Спасибо за эту информацию. 18.09.2019
  • Набор @lahsuk содержит только уникальные слова, но мне нужны все слова для их подсчета и определения частоты терминов всех слов. 18.09.2019
  • @lahsuk, можете ли вы проверить мой этот пост и предложить мне какие-либо изменения в коде 1#comment102389356_57983960" title="создать корпус, содержащий словарный запас слов"> stackoverflow.com/questions/57983960/ 18.09.2019
  • @AkmalMasud попробуйте использовать collections.counter, если хотите подсчитать количество слов. Просто верните этот счетчик и обновите его после получения обратно. (Я выполнил аналогичную задачу для ~ 55 тыс. файлов с ~ 24 млн токенов и занял всего 17 минут) 19.09.2019
  • @lahsuk, можете ли вы поделиться кодом, который мне поможет. и Вы видите мой другой пост? 19.09.2019
  • @lahsuk, как я могу сделать пакет слов из такого большого количества текста, который мой компьютер застрял во вложенном цикле, когда он добавляется в список пакетов слов. 19.09.2019
  • @AkmalMasud, как я уже говорил, используйте объект счетчика, если все, что вам нужно, это подсчитать частоту слов. docs.python.org/3/library/collections.html#collections. Счетчик 19.09.2019
  • @lahsuk Я делаю так, def termFrequencyInDoc(wordList): dict_words=dict(Counter(wordList)) return dict_words 19.09.2019

Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..