Постройте программу которая составляет алфавитно частотный словарь для заданного файла питон

Обновлено: 04.07.2024

Я хотел бы считать частоты всех слов в текстовом файле.

должен возвратить если целевой текстовый файл типа:

я реализовал его с помощью pure python после некоторые должности. Тем не менее, я обнаружил, что Pure-python недостаточно из-за огромного размера файла (> 1GB).

Я думаю, что власть sklearn заимствования является кандидат.

если вы позволите CountVectorizer считать частоты для каждой строки, Я думаю вы получите частоты слов, суммируя каждый столбец. Но, это звучит немного непрямо.

каков наиболее эффективный и простой способ подсчета слов в файле с python?

обновление

мой (очень медленный) код здесь:

самый краткий подход-использовать инструменты, которые дает вам Python.

вот и все. map(str.split, f) - это делает генератор, который возвращает list s слов из каждой строки. Оборачивать в chain.from_iterable преобразует это в один генератор, который производит слово за раз. Counter принимает входной iterable и подсчитывает все уникальные значения в нем. В конце концов, ты!--6--> a dict - подобный объект (a Counter ), что сохраняет все уникальные слова и их количество, и во время создания, вы только магазин строка данных за раз и общее количество, а не весь файл сразу.

теоретически, на Python 2.7 и 3.1, вы могли бы сделать немного лучше цикл над прикованными результатами самостоятельно и с помощью dict или collections.defaultdict(int) рассчитывать (потому что Counter реализован в Python, что может сделать его медленнее в некоторых случаях), но позволяет Counter сделать работу проще и более самодокументировать (я имею в виду, что вся цель подсчитывает, поэтому используйте Counter ). Помимо этого, на CPython (ссылка переводчика) 3.2 и выше Counter имеет ускоритель уровня C для подсчета итерационных входов, который будет работать быстрее, чем все, что вы могли бы написать в чистом Python.

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

ваш код работает намного медленнее, потому что он создает и уничтожает много маленьких Counter и set объектов, а не .update - ing один Counter один раз в строке (что, хотя немного медленнее, чем то, что я дал в обновленном блоке кода, было бы, по крайней мере, алгоритмически похоже на коэффициент масштабирования).

память эффективным и точным способом является использование

  • CountVectorizer в scikit (для извлечения ngram)
  • NLTK для word_tokenize
  • numpy матрица сумма для сбора графов
  • collections.Counter для сбора подсчетов и словарного запаса

по сути, вы также можете сделать это:

отметим, что CountVectorizer также можно взять файл вместо строки и tздесь нет необходимости читать весь файл в память. В коде:

вот некоторые ориентиры. Это будет выглядеть странно, но самый грубый код победит.

размер данных (154MB), используемый в бенчмарке выше:

  • С sklearn версия, есть накладные расходы на создание векторизатора + манипуляция numpy и преобразование в Counter объект
  • затем уроженца Counter обновить версию, похоже, Counter.update() is дорогостоящая операция

этого должно хватить.

пропустить CountVectorizer и scikit-узнать.

файл может быть слишком большим для загрузки в память, но я сомневаюсь, что словарь python становится слишком большим. Самый простой вариант для вас может состоять в том, чтобы разделить большой файл на 10-20 меньших файлов и расширить свой код для цикла над меньшими файлами.

Задумывались ли вы о быстром способе рассказать, на чем сосредоточен какой-то документ? Какова его основная тема? Позвольте мне дать вам этот простой трюк. Перечислите уникальные слова, упомянутые в документе, а затем проверьте, сколько раз было упомянуто каждое слово (частота). Этот способ даст вам представление о том, о чем документ в основном. Но это не будет легко работать вручную, поэтому нам нужен какой-то автоматизированный процесс, не так ли?

Да, автоматизированный процесс сделает это намного проще. Давайте посмотрим, как мы можем перечислить различные уникальные слова в текстовом файле и проверить частоту каждого слова с помощью Python.

Тестовый файл

В этом уроке мы будем использовать test.txt в качестве нашего тестового файла. Идите и скачайте, но не открывайте! Давайте сделаем маленькую игру. Текст в этом тестовом файле взят из одного из моих руководств в Envato Tuts +. Основываясь на частоте слов, давайте догадаемся, из какого из моих руководств этот текст был извлечен.

Пусть игра начнется!

Регулярные выражения

Поскольку мы собираемся применить шаблон в нашей игре, нам нужно использовать регулярные выражения (регулярные выражения). Если «регулярные выражения» — это новый термин для вас, это хорошее определение из Википедии:

Последовательность символов, определяющих шаблон поиска, в основном для использования при сопоставлении с шаблоном или при сопоставлении строк, т. Е. Операции типа «найти и заменить». Эта концепция возникла в 1950-х годах, когда американский математик Стивен Клин формализовал описание обычного языка и стал широко использоваться в утилитах обработки текста Unix ed, редакторе и grep, фильтре.

Если вы хотите узнать больше о регулярных выражениях, прежде чем продолжить работу с этим учебником, вы можете посмотреть мой другой учебник Регулярные выражения в Python и вернуться снова, чтобы продолжить этот учебник.

Построение Программы

Давайте работать шаг за шагом над созданием этой игры. Первое, что мы хотим сделать, это сохранить текстовый файл в строковой переменной.

Теперь, чтобы упростить применение нашего регулярного выражения, давайте превратим все буквы в нашем документе в строчные буквы, используя функцию lower () , следующим образом:

Давайте напишем наше регулярное выражение, которое будет возвращать все слова с количеством символов в диапазоне 14 . Начиная с 3 мы избегаем слов, которые могут не заинтересовать нас в подсчете их частоты, например, если , в , и т. Д., И слова, длина которых превышает 15 могут быть неверными. Регулярное выражение для такого шаблона выглядит следующим образом:

Частотный анализ является одним из сравнительно простых методов обработки текста на естественном языке (NLP). Его результатом является список слов, наиболее часто встречающихся в тексте. Частотный анализ также позволяет получить представление о тематике и основных понятиях текста. Визуализировать его результаты удобно в виде «облака слов». Эта диаграмма содержит слова, размер шрифта которых отражает их популярность в тексте.

Обработку текста на естественном языке удобно производить с помощью Python, поскольку он является достаточно высокоуровневым инструментом программирования, имеет развитую инфраструктуру, хорошо зарекомендовал себя в сфере анализа данных и машинного обучения. Сообществом разработано несколько библиотек и фреймворков для решения задач NLP на Python. Мы в своей работе будем использовать интерактивный веб-инструмент для разработки python-скриптов Jupyter Notebook, библиотеку NLTK для анализа текста и библиотеку wordcloud для построения облака слов.

В сети представлено достаточно большое количество материала по теме анализа текста, но во многих статьях (в том числе русскоязычных) предлагается анализировать текст на английском языке. Анализ русского текста имеет некоторую специфику применения инструментария NLP. В качестве примера рассмотрим частотный анализ текста повести «Метель» А. С. Пушкина.

Проведение частотного анализа можно условно разделить на несколько этапов:

  1. Загрузка и обзор данных
  2. Очистка и предварительная обработка текста
  3. Удаление стоп-слов
  4. Перевод слов в основную форму
  5. Подсчёт статистики встречаемости слов в тексте
  6. Визуализация популярности слов в виде облака

Загрузка данных

Открываем файл с помощью встроенной функции open, указываем режим чтения и кодировку. Читаем всё содержимое файла, в результате получаем строку text:


Длину текста – количество символов – можно получить стандартной функцией len:


Строка в python может быть представлена как список символов, поэтому для работы со строками также возможны операции доступа по индексам и получения срезов. Например, для просмотра первых 300 символов текста достаточно выполнить команду:

Предварительная обработка (препроцессинг) текста

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

Для начала переведём символы в единый регистр, например, нижний:


Используем стандартный набор символов пунктуации из модуля string:


string.punctuation представляет собой строку. Набор специальных символов, которые будут удалены из текста может быть расширен. Необходимо проанализировать исходный текст и выявить символы, которые следует удалить. Добавим к знакам пунктуации символы переноса строки, табуляции и другие символы, которые встречаются в нашем исходном тексте (например, символ с кодом \xa0):


Для удаления символов используем поэлементную обработку строки – разделим исходную строку text на символы, оставим только символы, не входящие в набор spec_chars и снова объединим список символов в строку:


Можно объявить простую функцию, которая удаляет указанный набор символов из исходного текста:


Её можно использовать как для удаления спец.символов, так и для удаления цифр из исходного текста:

Токенизация текста

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


Переменная text_tokens представляет собой список слов (токенов). Для вычисления количества слов в предобработанном тексте можно получить длину списка токенов:

Для вывода первых 10 слов воспользуемся операцией среза:


Для применения инструментов частотного анализа библиотеки NLTK необходимо список токенов преобразовать к классу Text, который входит в эту библиотеку:


Выведем тип переменной text:


К переменной этого типа также применимы операции среза. Например, это действие выведет 10 первых токенов из текста:

Подсчёт статистики встречаемости слов в тексте

Для подсчёта статистики распределения частот слов в тексте применяется класс FreqDist (frequency distributions):


Попытка вывести переменную fdist отобразит словарь, содержащий токены и их частоты – количество раз, которые эти слова встречаются в тексте:


Также можно воспользоваться методом most_common для получения списка кортежей с наиболее часто встречающимися токенами:


Частота распределения слов тексте может быть визуализирована с помощью графика. Класс FreqDist содержит встроенный метод plot для построения такого графика. Необходимо указать количество токенов, частоты которых будут показаны на графике. С параметром cumulative=False график иллюстрирует закон Ципфа: если все слова достаточно длинного текста упорядочить по убыванию частоты их использования, то частота n-го слова в таком списке окажется приблизительно обратно пропорциональной его порядковому номеру n.


image

Можно заметить, что в данный момент наибольшие частоты имеют союзы, предлоги и другие служебные части речи, не несущие смысловой нагрузки, а только выражающие семантико-синтаксические отношения между словами. Для того, чтобы результаты частотного анализа отражали тематику текста, необходимо удалить эти слова из текста.

Удаление стоп-слов

К стоп-словам (или шумовым словам), как правило, относят предлоги, союзы, междометия, частицы и другие части речи, которые часто встречаются в тексте, являются служебными и не несут смысловой нагрузки – являются избыточными.

Библиотека NLTK содержит готовые списки стоп-слов для различных языков. Получим список сто-слов для русского языка:


Следует отметить, что стоп-слова являются контекстно зависимыми – для текстов различной тематики стоп-слова могут отличаться. Как и в случае со спец.символами, необходимо проанализировать исходный текст и выявить стоп-слова, которые не вошли в типовой набор.

Список стоп-слов может быть расширен с помощью стандартного метода extend:


После удаления стоп-слов частота распределения токенов в тексте выглядит следующим образом:


Как видно, результаты частотного анализа стали более информативными и точнее стали отражать основную тематику текста. Однако, мы видим в результатах такие токены, как «владимир» и «владимира», которые являются, по сути, одним словом, но в разных формах. Для исправления этой ситуации необходимо слова исходного текста привести к их основам или изначальной форме – провести стемминг или лемматизацию.

Визуализация популярности слов в виде облака

В завершение нашей работы визуализируем результаты частотного анализа текста в виде «облака слов».

Для этого нам потребуются библиотеки wordcloud и matplotlib:


Для построения облака слов на вход методу необходимо передать строку. Для преобразования списка токенов после предобработки и удаления стоп-слов воспользуемся методом join, указав в качестве разделителя пробел:


Выполним вызов метода построения облака:


В результате получаем такое «облако слов» для нашего текста:

image

Глядя на него, можно получить общее представление о тематике и главных персонажах произведения.

Вы когда-нибудь задумывались, есть ли быстрый способ узнать, чему посвящен тот или иной документ, какая тематика?

Предлагаю вам один простой прием.

Составьте список слов, упоминающихся в документе, а затем проверьте, сколько раз встречалось каждое слово (его частоту).

Таким образом, мы будем иметь небольшое представление о том, о чем идет речь. Как минимум верхнеуровнево.

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

Предположим, что у вас есть некий файл text.txt.

Регулярные выражения

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

В данной статье мы будем использовать их для создания выборки слов.

Реализация программы

Первое, что нам нужно сделать, это сохранить текст из файла в строковую переменную.

Далее, чтобы упростить применение нашего регулярного выражения, давайте переведем все слова в документе в нижний регистр, используя функцию lower():

b означает ограничение на количество символов.

Регулярное выражение можно реализовать следующим образом:

Если предположить, что мы объявили пустой словарь frequency = <>, то реализация этого будет выглядеть следующим образом:

Теперь мы можем смотреть наши ключи с помощью:

Чтобы получить все слова и их частоту (количество раз, когда они встречаются в текстовом файле), мы можем сделать следующее:

Давайте соберем все месте.

Собираем все вместе

В как это будет выглядеть:

Сохраните статью в социальных сетях, чтобы не потерять.

Похожие записи

Если вам нужно скопировать файл с помощью Python, но вы не знаете, как это сделать,…

Иногда нам нужно преобразовать Excel или CSV в другой формат, в этот раз мне нужно…

Python - очень универсальный язык, который позволяет автоматизировать множество задач. В этом уроке я покажу…

Читайте также: