Закон Ципфа

 
0
 
Python
ava
Anriuser | 19.12.2016, 18:01
Добрый вечер. Вообщем есть реализирован первый который строит гистограму по словам в тексте.
"Измерим количество вхождений каждого слова в текст и возьмем только одно значение из каждой группы, имеющей одинаковую частоту. Расположим частоты по мере их убывания и пронумеруем, порядковый номер частоты назовем рангом частоты Выделение ключевых слов в текстовых документах ранг слова Выделение ключевых слов в текстовых документах). Наиболее часто встречающиеся слова будут иметь ранг 1, следующие за ними – 2 и так далее"
Первое это проблема с кодировкой: На графике легенда отображается неправильно.
Если я удалю эти строки
reload(sys)  
sys.setdefaultencoding('Cp1252')
Выдается ошибка при построении на русском и украинском языке. Нужно сделать тчоб график на любом языке нормально рисовался.
Второе: Нужно построить второй график, отложив по оси абсцисс частоту вхождения слова, а по оси ординат – количество слов в данной частоте.
Проект прикрепил
Kommentare (11)
ava
Anriuser | 20.12.2016, 00:13 #
Спасибо что скачали хоть глянуть. Если есть вопросы по самом законе то напишите
ava
Anriuser | 20.12.2016, 00:13 #
Ато  у меня там в реферате все пишет
ava
baldman88 | 20.12.2016, 22:07 #
Какая ОС? Для работы с не ASCII символами лучше использовать UTF-8 (в Windows проще всего сохранять в чем-то вроде Notepad++, и выставлять кодировку в UTF-8).
Вот так, вроде, работает (если кириллический текст сохранен в UTF-8):
#!/usr/bin/python

# -*- coding: utf-8 -*-

import numpy as np
import string
from operator import itemgetter
import matplotlib.pyplot as plt
import codecs
from matplotlib import rc

font = {'family': 'Arial',
        'weight': 'normal'}
rc('font', **font)


my_dictionary = dict([])
sorted_dictionary = dict([])


textfile = '/home/baldman/downloads/up.txt'
f = codecs.open(textfile, encoding='utf-8').read()
words = f.split()

for w in words:
    w = ''.join(ch for ch in w if ch not in string.punctuation)
    w = w.lower()
    
    if w in my_dictionary:
        my_dictionary[w] += 1
    else:
        my_dictionary[w] = 1

print
print "Dictionary size = ", len(my_dictionary) 
print

sorted_dictionary = sorted(my_dictionary.items(), key=itemgetter(1), reverse=True)
    
max_count = 50
for w,c in sorted_dictionary[0 : max_count]:
    print "%s\t\t: %d" % (w, c)
hist_words = [x[0] for x in sorted_dictionary]
hist_count = [x[1] for x in sorted_dictionary]
plt.figure()
X = np.arange(max_count)
plt.bar(X, hist_count[0 : max_count], align='center', width=0.5)
plt.xticks(X, hist_words[0 : max_count], rotation='vertical')
ymax = max(hist_count[0 : max_count]) + 0.1 * max(hist_count[0 : max_count])
plt.ylim(0, ymax)
plt.show()
# Log-log plot of all words
plt.figure()
Y = np.arange(1, len(my_dictionary) + 1)
plt.plot(np.log(Y), np.log(hist_count))
plt.show()
Со шрифтом можно поиграться. Использовал первый, пришедший в голову из набора Windows.
И да, я там немного поменял диапазон для Y (начинается с 1, а не с 0), так как взятие логарифма от 0 плохая идея.
ava
Anriuser | 24.12.2016, 17:08 #
Спачибо большое вам, сейчас проверю думал уже никто не поможет)
ava
Anriuser | 24.12.2016, 17:08 #
Спачибо большое вам, сейчас проверю думал уже никто не поможет)
ava
Anriuser | 24.12.2016, 17:26 #
Я в пайтоне 3.5.2 вообщем ошибка там  file = builtins.open(filename, mode, buffering)
PermissionError: [Errno 13] Permission denied: 'C:/Users/User/Desktop/zipf'
ava
Anriuser | 24.12.2016, 17:26 #
Я в пайтоне 3.5.2 вообщем ошибка там  file = builtins.open(filename, mode, buffering)
PermissionError: [Errno 13] Permission denied: 'C:/Users/User/Desktop/zipf'
ava
Anriuser | 24.12.2016, 17:46 #
Заработало, пайтон 2.7 юзаю, сам незнаю что было вам большое спасибо за решение. Со вторым я уже сам поекспериментирую
ava
baldman88 | 24.12.2016, 22:49 #
Кстати, в моем коде не учтен один момент: если в тексте есть дефисы и тире, то после сравнения с string.punctuation в my_dictionary будут добавляться пустые строки. Лучше переделать так:

...
for w in words:
    w = ''.join(ch for ch in w if ch not in string.punctuation)
    w = w.lower()

    if len(w) > 0:
        if w in my_dictionary:
            my_dictionary[w] += 1
        else:
            my_dictionary[w] = 1
...
ava
Anriuser | 25.12.2016, 00:30 #
щяс сделаем спасибо

später ergänzt:
baldman88, как тут чтоли лайк вам поставить ?))) Ато я тут недавно )
ava
baldman88 | 25.12.2016, 12:11 #
Большого человеческого спасибо вполне достаточно. Просто тоже старайтесь помогать другим, по возможности :yes3 
Registrieren Sie sich oder melden Sie sich an, um schreiben zu können.
Unternehmen des Tages
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Mitwirkende
advanced
Absenden