Методы подсчёта слов в текстах с помощью Python
Основные методы подсчета слов в Python
Подсчет слов в тексте - распространенная задача при обработке строк. В Python доступны разные подходы, от встроенных методов до регулярных выражений и специализированных библиотек. Выбор способа зависит от требований к точности, производительности и сложности текста.
Базовый метод: split() и len()
Самый простой и быстрый способ - разбить строку по пробелам с помощью split() и вычислить длину полученного списка:
text = "Пример текста для подсчета слов"
word_count = len(text.split())
print(word_count)заменить символ на другой python (замена символа в строке на python)
4
Strip строки python (метод strip для строк в python)
Метод split() без аргументов разбивает строку по любым последовательностям пробельных символов (пробел, табуляция, перевод строки) и корректно обрабатывает лишние пробелы. Однако знаки препинания становятся частью слов. Если требуется их удалить, нужно предварительно очистить текст.
Типичные проблемы и их решения
- Пустая строка:
len("".split())даст 0. - Слова с дефисами: "как-то" считается одним словом. Для разделения на части нужна дополнительная обработка (например, замена дефиса на пробел).
- Знаки препинания: Если они не нужны, применяют
text.replace(',','')или используют регулярные выражения.
Как подсчитать слова с учетом знаков препинания?
Регулярные выражения помогают выделить только буквенные последовательности.
import re
text = "Привет, мир! Это - пример."
words = re.findall(r'\b\w+\b', text)
print(len(words))Python знак в строке (проверка наличия символа в строке python)
4
Python убрать пробелы (удаление пробелов из строки в python)
Шаблон \b\w+\b находит слова, состоящие из букв, цифр и символа подчеркивания. Для кириллицы флаг re.UNICODE (по умолчанию в Python 3) обеспечивает корректную работу.
Проблемы регулярного подхода
- Символы типа апострофа ("don't") могут быть разбиты. Для их сохранения шаблон усложняется.
- Производительность на больших текстах ниже, чем у
split().
Как подсчитать слова в файле большого размера?
Построчное чтение экономит память:
total = 0
with open('text.txt', 'r', encoding='utf-8') as f:
for line in f:
total += len(line.split())
print(total)числа в строке python задача (задача: числа в строке в python)
Для каждого файла можно адаптировать кодировку. Если требуется учет пунктуации, применяют re.findall к каждой строке.
Как подсчитать уникальные слова?
Множество set автоматически убирает дубликаты:
text = "слово слово слово уникальное"
unique = set(text.split())
print(len(unique))Python количество слов (подсчет количества слов в python)
2
Python слово в строке (поиск слова в строке python)
Как подсчитать частоту каждого слова?
Модуль collections.Counter возвращает словарь с количеством вхождений:
from collections import Counter
text = "кошка собака кошка птица кошка"
word_counts = Counter(text.split())
print(word_counts.most_common(2))разделить слово python (разделение строки на слова в python)
[('кошка', 3), ('собака', 1)]
Как подсчитать слова, удовлетворяющие условию?
Например, слова длиннее 4 символов:
words = text.split()
long = [w for w in words if len(w) > 4]
print(len(long))
Как обработать текст с HTML-тегами?
Удаление тегов с помощью регулярного выражения:
import re
html = "<p>Текст абзаца</p><br/>"
clean = re.sub(r'<[^>]+>', '', html)
print(len(clean.split()))
2
Расширенные и нетривиальные примеры подсчета слов
1. Подсчет слов с учетом Unicode и апострофов
Для текстов на английском с сокращениями вроде "don't" используется шаблон, сохраняющий апостроф внутри слова:
import re
text = "Don't count the words, but the meaning."
pattern = r"[a-zA-Z]+(?:'[a-zA-Z]+)?"
words = re.findall(pattern, text)
print(len(words))
7
2. Подсчет слов с удалением стоп-слов
Стоп-слова (предлоги, союзы) часто исключаются при анализе. Пример со списком стоп-слов:
stop_words = {'и', 'в', 'на', 'с', 'по', 'для', 'о', 'от', 'к', 'у'}
text = "Кошка и собака играют на лужайке"
words = text.lower().split()
filtered = [w for w in words if w not in stop_words]
print(len(filtered))
3
3. Подсчет биграмм (пар слов)
Количество последовательных пар слов может дать информацию о коллокациях:
from collections import Counter
text = "Python язык программирования высокого уровня"
words = text.split()
bigrams = zip(words, words[1:])
bigram_counts = Counter(bigrams)
print(bigram_counts.most_common(2))
[(('Python', 'язык'), 1), (('язык', 'программирования'), 1)]
4. Подсчет слов в нескольких файлах с использованием генератора
Генератор позволяет обрабатывать файлы без загрузки всего содержимого в память:
import os
def word_generator(filenames):
for fname in filenames:
with open(fname, 'r', encoding='utf-8') as f:
for line in f:
for word in line.split():
yield word
files = ['file1.txt', 'file2.txt']
total = sum(1 for _ in word_generator(files))
print(total)
5. Подсчет слов после лемматизации (пример с библиотекой pymorphy2)
Лемматизация приводит слова к начальной форме, что может изменить подсчёт (например, "бежал", "бежать" считаются одним словом). Пример:
import pymorphy2
morph = pymorphy2.MorphAnalyzer()
text = "бежал бежать бегут"
lemmas = [morph.parse(w)[0].normal_form for w in text.split()]
print(len(set(lemmas))) # уникальные леммы
2
6. Подсчет слов в PDF-документе с помощью PyPDF2
Извлекается текст со всех страниц, затем подсчитываются слова:
import PyPDF2
reader = PyPDF2.PdfReader('document.pdf')
text = ''.join(page.extract_text() for page in reader.pages)
print(len(text.split()))
7. Параллельный подсчет слов в большом тексте
Для ускорения можно разбить текст на части и обработать их в пуле потоков:
from multiprocessing import Pool
def count_words_chunk(chunk):
return len(chunk.split())
with open('big_file.txt', 'r', encoding='utf-8') as f:
data = f.read()
# Разделяем на 4 равные части
n = len(data) // 4
chunks = [data[i:i+n] for i in range(0, len(data), n)]
with Pool(4) as p:
results = p.map(count_words_chunk, chunks)
print(sum(results))
Этот подход дает выигрыш при очень больших текстах и многоядерных процессорах.