Буквенные частоты: построите гистограмму, упорядочив значения PYTHON - PullRequest
0 голосов
/ 24 сентября 2018

Что я пытаюсь сделать, это проанализировать частоту букв в тексте.В качестве примера я буду использовать здесь небольшое предложение, но все, что, как предполагается, анализирует огромные тексты (так что лучше быть эффективным).

Хорошо, у меня есть следующий текст:

test = "quatre jutges dun jutjat mengen fetge dun penjat"

Затем я создал функцию, которая считает частоты

def create_dictionary2(txt):
    dictionary = {}
    i=0
    for x in set(txt):
        dictionary[x] = txt.count(x)/len(txt)
    return dictionary

И затем

import numpy as np
import matplotlib.pyplot as plt
test_dict = create_dictionary2(test)
plt.bar(test_dict.keys(), test_dict.values(), width=0.5, color='g')

Я получаю enter image description here

ПРОБЛЕМЫ: Я хочу видеть все буквы, но некоторые из них не видны (Контейнерный объект из 15 художников) Как расширить гистограмму?Затем я хотел бы отсортировать гистограмму, чтобы получить что-то вроде этого enter image description here

этого enter image description here

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Другое решение, использующее панд:

import pandas as pd
import matplotlib.pyplot as plt

test = "quatre jutges dun jutjat mengen fetge dun penjat"

# convert input to list of chars so it is easy to get into pandas 
char_list = list(test)

# create a dataframe where each char is one row
df = pd.DataFrame({'chars': char_list})
# drop all the space characters
df = df[df.chars != ' ']
# add a column for aggregation later
df['num'] = 1
# group rows by character type, count the occurences in each group
# and sort by occurance
df = df.groupby('chars').sum().sort_values('num', ascending=False) / len(df)

plt.bar(df.index, df.num, width=0.5, color='g')
plt.show()

Результат:

enter image description here

Редактировать : я приуроченРешения my и ikkuh

Использование счетчика: 10000 циклов, лучшее из 3: 21,3 мкс на цикл

Использование группового панды: 10 циклов, лучшее из 3: 22,1 мс на цикл

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

0 голосов
/ 24 сентября 2018

Для подсчета мы можем использовать объект Counter.Счетчик также поддерживает получение пар ключ-значение для наиболее распространенных значений:

from collections import Counter

import numpy as np
import matplotlib.pyplot as plt

c = Counter("quatre jutges dun jutjat mengen fetge dun penjat")
plt.bar(*zip(*c.most_common()), width=.5, color='g')

Метод most_common возвращает список кортежей ключ-значение.*zip(*..) используется для распаковки (см. этот ответ ).

Примечание. Я не обновил ширину или цвет в соответствии с вашими результатами.

...