подсчёт слов в тексте

qqweqweqweqweqwe

Новичок
Пользователь
Июл 9, 2020
3
1
3
Здравствуйте, хотел бы посчитать количество разных слов тексте, а потом вывести лист со словами и его частотой другой файл, источник содержит себе англ. и русский язык.
Прошу помочь с решение проблемы русского языка, так как программа, кажется, не считает русские слова, заранее спасибо.


# -*- coding: utf-8 -*-
import re
frequency = {}
document_text = open('test.txt', 'r')
final_list = open("list.txt", "w")
text_string = document_text.read().lower()
match_pattern = re.findall(r'\b[a-z]{1,40}\b', text_string)
match_pattern = re.findall(r'\b[a-я]{1,40}\b', text_string)

for word in match_pattern:
count = frequency.get(word, 0)
frequency[word] = count + 1

frequency_list = frequency.keys()

for words in frequency_list:
final_list.write(words, frequency[words])

print("final")
 
  • Мне нравится
Реакции: Student

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Благодарю, но у меня почему-то в большой книге счёт слов закончился на отметке в 2 повторения, также результат не сохраняется в файл list.txt, наверное, с моей стороны будет наглостью, но возможно ли физический реализовать такое, чтобы определённое слово (например "мостом") из какого-то склонения считалось как одно слово именительном падеже, то есть мостом = мост, также интересует как починить проблему с большими и маленькими буквами, то есть Мост и мост считаются разными словами
Код вставляйте через кнопку ... -> код -> python.
Вот пример с сохранением в файл и приведением слов к нижнему регистру:
Python:
from collections import Counter


words = []  # список слов

# список знаков пунктуации
punctuation = [',', '.', '!', '...', '?', ';', ':']

# чтение файла
with open('test.txt', 'r', encoding='utf-8') as f:
    text = f.read()  # текст файла

    # очистка от пунктуации
    for s in punctuation:
        text = text.replace(s, '')

    # разделение по словам
    words = text.split()

# приведение слов к нижнему регистру
words = list(map(lambda word: word.lower(), words))

# подсчет частоты слов
stats = Counter(words)

# сортировка по частоте
stats = sorted(stats.items(), key=lambda x: x[1], reverse=True)

# сохранение в файл
with open('list.txt', 'w', encoding='utf-8') as f:
    for t in stats:
        f.write(f'{t[0]}: {t[1]}\n')
Насчет проверки однокоренных слов - это можно сделать (например создать список падежных окончаний имен существительных, проверять заканчивается ли слово на одно из этих окончаний и обрезать его) только работать это будет не точно (например обрезать слова, которые заканчиваются на те же буквы, но в данном слове они не являются падежным окончанием).
 
  • Мне нравится
  • Wow!
Реакции: Student и qqweqweqweqweqwe

qqweqweqweqweqwe

Новичок
Пользователь
Июл 9, 2020
3
1
3
Ещё было бы интересно узнать каким образом сделать так чтобы слова были отсортированы по частоте
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Вот пример:
Python:
from collections import Counter


words = []  # список слов

# список знаков пунктуации
punctuation = [',', '.', '!', '...', '?', ';', ':']

# чтение файла
with open('test.txt', 'r', encoding='utf-8') as f:
    text = f.read()  # текст файла

    # очистка от пунктуации
    for s in punctuation:
        text = text.replace(s, '')

    # разделение по словам
    words = text.split()

# подсчет частоты слов и сортировка по частоте
stats = Counter(words)

# вывод в консоль
print(stats)
Также если текст большой и важна скорость можете использовать string.maketrans, вот тут есть пример и сравнение скорости: ссылка.
 
  • Wow!
Реакции: Student

qqweqweqweqweqwe

Новичок
Пользователь
Июл 9, 2020
3
1
3
Благодарю, но у меня почему-то в большой книге счёт слов закончился на отметке в 2 повторения, также результат не сохраняется в файл list.txt, наверное, с моей стороны будет наглостью, но возможно ли физический реализовать такое, чтобы определённое слово (например "мостом") из какого-то склонения считалось как одно слово именительном падеже, то есть мостом = мост, также интересует как починить проблему с большими и маленькими буквами, то есть Мост и мост считаются разными словами

# -*- coding: utf-8 -*-
from collections import Counter

words = []
final_list = open("list.txt", "w")
punctuation = [',', '.', '!', '...', '?', ';', ':']

with open('test.txt', 'r', encoding='utf-8') as f:
text = f.read()

for s in punctuation:
text = text.replace(s, '')

words = text.split()

stats = Counter(words)

final_list.write(stats)
 
Последнее редактирование:

Форум IT Специалистов