Python - вычислить частоту слов в процентах - PullRequest
0 голосов
/ 18 октября 2018

У меня есть текст, в котором я рассчитал количество слов и частоту слов.Теперь я должен отображать топ-7 в процентном отношении.Я понятия не имею, как это сделать.Я знаю, как рассчитать процент, часть / целое, но не уверен, как написать код.Я выполнил сортировку по значению ниже.

def word_frequency():
"""
Function for word frequency
"""
d = dict()

with open(TEXT, "r") as f:
    for line in f:
        words = line.split()
        for w in words:
            if w in d:
                d[w] += 1
            else:
                d[w] = 1

    dict_list = sorted(d.items(), key = itemgetter(1), reverse = True)
    print(dict_list[0:7])

Это дает мне этот список:

[('the', 12), ('to', 8), ('of', 6), ('and', 5), ('a', 4), ('in', 4), ('Phil', 3)]

Но как рассчитать и представить их в процентах вместо значения?Количество слов в тексте: 199.

С уважением

РЕДАКТИРОВАТЬ: НОВЫЙ ПЕРЕСМОТРЕННЫЙ КОД

def word_frequency():
"""
Function for word frequency
"""
d = dict()

with open(TEXT, "r") as f:
    for line in f:
        words = line.split()
        for w in words:
            if w in d:
                d[w] += round(1/1.99, 1)
            else:
                d[w] = round(1/1.99, 1)

    dict_list = sorted(d.items(), key = itemgetter(1), reverse = True)
    print(dict_list[0:7])

Дает мне этот список:

[('the', 6.0), ('to', 4.0), ('of', 3.0), ('and', 2.5), ('a', 2.0), ('in', 2.0), ('Phil', 1.5)]

У меня есть процентное соотношение, но есть ли способ представить его лучше?Как:

the 6%
to 4%
of 3%
and 2.5%
a 2%
in 2%
Phil 1.5%

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

В качестве альтернативы вы можете использовать Counter из collections для подсчета частот слов.

from operator import itemgetter
from collections import Counter

def most_common(instances):
    """Returns a list of (instance, count) sorted in total order and then from most to least common"""
    return sorted(sorted(Counter(instances).items(), key=itemgetter(0)), key=itemgetter(1), reverse=True)

Используя эту функцию most_common, вы можете делать так, как вы сказали "вычислить процент,часть / целое ".Что вы делаете, перебирая слово и его частоту и деля его на общее количество слов.

# words = list of strings
frequencies = most_common(words)
percentages = [(instance, count / len(words)) for instance, count in frequencies]

В зависимости от вашего варианта использования, re.findall(r"\w+", text) может быть не лучшим подходом кизвлечение слов.

Чтобы получить 7 лучших слов, вы можете нарезать percentages, выполнив percentages[:7].

import re

text = "Alice opened the door and found that it led into a small passage, not much larger than a rat-hole: she knelt down and looked along the passage into the loveliest garden you ever saw."

words = re.findall(r"\w+", text)
frequencies = most_common(words)
percentages = [(instance, count / len(words)) for instance, count in frequencies]

for word, percentage in percentages[:7]:
    print("%s %.2f%%" % (word, percentage * 100))

Какие выходные данные:

the 8.57%
a 5.71%
and 5.71%
into 5.71%
passage 5.71%
Alice 2.86%
along 2.86%

Если вы хотите, чтобы одно и то же слово в разных оболочках считалось одинаковым.Затем вы можете нормализовать все слова до вызова most_common.

import unicodedata

def normalize_caseless(text):
    return unicodedata.normalize("NFKD", text.casefold())

Затем:

words = ...

Становится:

words = list(map(normalize_caseless, ...))

Затем строка, содержащаяодно и то же слово в разных оболочках, например:

text = "Hello Test test TEST test TeSt"

Результат:

test 83.33%
hello 16.67%

Вместо:

test 33.33%
Hello 16.67%
TEST 16.67%
TeSt 16.67%
Test 16.67%
0 голосов
/ 18 октября 2018

Вы можете перечислять элементы в словаре

for k, v in dict_list.items():
    percent = str(v) + ' %'
    result = k + ' ' + percent
    print(result)
...