Как посчитать слова в тексте с помощью Python
Подсчёт слов в Python: простое и точное решение
Как быстро получить количество слов, игнорируя лишние пробелы?
Самый простой и быстрый способ — использовать метод split(). Он разбивает строку по любым пробельным символам (пробел, табуляция, перевод строки) и автоматически удаляет пустые элементы. Результат — список слов, а его длина — искомое число.
text = "Программирование на Python увлекательно!"
word_count = len(text.split())
print(word_count) # 3количество слов python (подсчёт количества слов в python)
Пояснение: split() без аргументов обрабатывает даже множественные пробелы и возвращает только непустые элементы. Это решение подходит для большинства задач, где не требуется учитывать знаки препинания как часть слова.
Типичная ошибка: использование split(' ') с явным пробелом. В этом случае строка с несколькими пробелами создаёт пустые строки в списке, и количество слов будет завышено. Решение — всегда применять split() без аргументов.
Как учесть знаки препинания и пунктуацию?
Если слово «Python!» должно считаться одним словом, а не «Python!» отдельно, используют регулярные выражения. Модуль re позволяет выделить только буквенно-цифровые последовательности.
import re
text = "Привет, мир! Сколько здесь слов?"
words = re.findall(r'\w+', text)
print(len(words)) # 5вывести количество чисел в python (вывод количества чисел в python)
Примечание: шаблон \w+ соответствует буквам, цифрам и символу подчёркивания. Для русского языка это тоже работает, так как \w в Python учитывает Unicode.
Проблема: если текст содержит апострофы или дефисы внутри слов (например, «кое-как», «don't»), регулярка \w+ разобьёт их на части. Для сохранения таких слов используют r"[\w'-]+" или более сложные шаблоны.
Как подсчитать количество уникальных слов?
Для получения числа уникальных лексических единиц достаточно превратить список слов во множество set.
text = "Python Python java java C#"
unique = len(set(text.lower().split()))
print(unique) # 3 (python, java, c#)
Важно: приведение к нижнему регистру помогает избежать дублирования из-за разного регистра.
Как подсчитать частоту каждого слова?
Используйте collections.Counter. Он возвращает словарь, где ключи — слова, значения — количество вхождений.
from collections import Counter
text = "яблоко груша яблоко апельсин груша яблоко"
counter = Counter(text.split())
print(counter) # Counter({'яблоко': 3, 'груша': 2, 'апельсин': 1})
Ошибка: если в тексте есть знаки препинания, слова с одинаковым смыслом будут считаться разными. Перед подсчётом следует очистить текст регулярным выражением.
Как обработать большой файл, не загружая его целиком в память?
Читайте файл построчно и обновляйте счётчик на каждой итерации. Для экономии памяти можно использовать wc-подобный алгоритм.
def count_words_in_file(filename):
total = 0
with open(filename, 'r', encoding='utf-8') as f:
for line in f:
total += len(line.split())
return total
print(count_words_in_file('example.txt'))
Совет: если нужна ещё и статистика по словам, используйте Counter с обновлением через counter.update(line.split()).
Как подсчитать слова, игнорируя цифры или специальные символы?
Настройте регулярное выражение под нужные критерии. Например, только кириллические слова:
import re
text = "Тест123 и ещё тест."
words = re.findall(r'[а-яА-ЯёЁ]+', text)
print(len(words)) # 3
Проблема: при работе с разными языками шаблон может стать громоздким. Лучше использовать Unicode-свойства: p{L} с модулем regex (нестандартный пакет).
Все примеры можно комбинировать в зависимости от конкретной задачи. Основное решение через split() работает в 90% случаев и не требует дополнительных библиотек.
Расширенные примеры подсчёта слов
Ниже приведены более специфичные сценарии с подробными пояснениями.
1. Подсчёт слов определённой длины
Отбор слов, длина которых больше 5 символов:
text = "Программирование это искусство"
words = [w for w in text.split() if len(w) > 5]
print(words) # ['Программирование', 'искусство']
print(len(words)) # 2
['Программирование', 'искусство'] 2
2. Подсчёт слов с заглавной буквы
Регулярное выражение с учётом Unicode для поиска слов, начинающихся с заглавной:
import re
text = "Москва столица России. Рим древний город."
capital_words = re.findall(r'\b[А-ЯЁA-Z][а-яёa-z]*', text)
print(len(capital_words)) # 3 (Москва, Россия, Рим)
3
3. Частотный анализ с сортировкой по количеству
Вывод 3 самых частых слов с очисткой от пунктуации:
from collections import Counter
import re
text = "Яблоко, груша, яблоко, апельсин, груша, яблоко, банан."
words = re.findall(r'\w+', text.lower())
counter = Counter(words)
most_common = counter.most_common(3)
print(most_common)
[('яблоко', 3), ('груша', 2), ('апельсин', 1)]
4. Подсчёт слов в строке с эмодзи
Эмодзи не являются буквенно-цифровыми символами, поэтому \w+ их игнорирует. Если нужно считать их как слова, используйте более широкий класс:
import re
text = "Привет ? как дела? ??"
# Сохраним только эмодзи и буквы
words = re.findall(r'[\w?]+', text)
print(len(words)) # 4: ['Привет', '?', 'как', 'дела']
4
5. Потоковая обработка очень большого файла с подсчётом уникальных слов
Используем set и читаем файл построчно, чтобы не держать всё в памяти:
unique_words = set()
with open('big_file.txt', 'r', encoding='utf-8') as f:
for line in f:
# очищаем от пунктуации и приводим к нижнему регистру
import re
words = re.findall(r'\w+', line.lower())
unique_words.update(words)
print(f"Уникальных слов: {len(unique_words)}")
6. Подсчёт слов, игнорируя стоп-слова
Фильтрация перед подсчётом:
stop_words = {'и', 'в', 'на', 'с', 'по', 'для', 'от'}
text = "Книга на столе и ручка в ящике"
words = [w.lower() for w in text.split() if w.lower() not in stop_words]
print(len(words)) # 4: книга, столе, ручка, ящике
4
7. Использование библиотеки NLTK для подсчёта слов с учётом токенизации
NLTK предоставляет более продвинутую токенизацию, учитывающую сокращения и пунктуацию:
from nltk.tokenize import word_tokenize
# предварительно скачать punkt: nltk.download('punkt')
text = "I can't do it."
tokens = word_tokenize(text)
print(tokens)
print(len(tokens)) # 5: ['I', 'ca', "n't", 'do', 'it', '.'] (пунктуация отдельно)
['I', 'ca', "n't", 'do', 'it', '.'] 6
Обратите внимание: NLTK выделяет апостроф отдельно. Для подсчёта только слов можно отфильтровать знаки.
Примеры показывают гибкость Python при работе с текстовыми данными. Выбор метода зависит от требований к точности, производительности и контексту.