Как рассчитать пропорции слов, которые появляются с заглавной буквы - PullRequest
0 голосов
/ 18 января 2019

Используя Python, я хотел бы рассчитать пропорции слов, которые появляются с заглавной первой буквой. Например, вот пример списка слов,

word_list = ["capital", "Capital", "Capital", "Capital", "capital", "bus", "Bus", "bus", "Bus", "white"]

и я хотел бы получить результат, как показано ниже:

{"Capital": 0.6, "Bus": 0.5, "White": 0}

У вас есть идеи по этому поводу? Это кажется легким, но трудно придумать хорошие решения. Чтобы быть точным, легко подсчитать количество слов, начинающихся с заглавной буквы, с помощью defaultdict.

word_dict = defaultdict(int)
for word in word_list:
    if word[0].isupper():
        word_dict[word] += 1

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 18 января 2019

отсортированных слов: itertools.groupby

Предполагая, что, как в вашем примере, ваши строки отсортированы, вы можете использовать groupby с statistics.mean:

from itertools import groupby
from statistics import mean

grouper = groupby(word_list, key=str.casefold)
res = {k.capitalize(): mean(x[0].isupper() for x in words) for k, words in grouper}

# {'Bus': 0.5, 'Capital': 0.6, 'White': 0}

Слова не обязательно отсортированы: sorted + groupby

В этом случае вы можете отсортировать до , применяя указанную выше логику:

word_list = sorted(word_list, key=str.casefold)

Это добавляет сложности алгоритму, если ваш список не отсортирован.

Слова не обязательно отсортированы: collections.defaultdict

Альтернативой является создание словаря со списками логических значений через collections.defaultdict, затем используйте statistics.mean:

from collections import defaultdict
from statistics import mean

dd = defaultdict(list)
for word in word_list:
    dd[word.capitalize()].append(word[0].isupper())

# defaultdict(list,
#             {'Bus': [False, True, False, True],
#              'Capital': [False, True, True, True, False],
#              'White': [False]})

res = {k: mean(v) for k, v in dd.items()}

# {'Bus': 0.5, 'Capital': 0.6, 'White': 0}
0 голосов
/ 18 января 2019

Вы можете сделать что-то вроде этого:

from collections import Counter

word_list = ["capital", "Capital", "Capital", "Capital", "capital", "bus", "Bus", "bus", "Bus", "white"]

# count them all while ignoring case
count = Counter(x.lower() for x in word_list)  

# count only the title-case ones
uppers = Counter(x.lower() for x in word_list if x[0].isupper())

# get frequency
res = {k.capitalize(): uppers.get(k, 0)/v for k, v in count.items()} 

, что приводит к желаемому:

print(res)  # -> {'Capital': 0.6, 'Bus': 0.5, 'White': 0.0}
...