2016-03-04 3 views
0

Предположим, у меня есть огромный .txt-файл, полный случайных символов, и я хочу узнать «редкие». Есть ли какой-нибудь модуль (что-то вообще, на самом деле) в Python (возможно, версия 3.x, но у меня также есть машина, использующая Python 2.7, если она лучше), написанная для этой цели? В случае положительного ответа, где я могу найти основное объяснение его функционирования? спасибо.Найти редких персонажей с Python

+1

От _rare ones_ вы имели в виду низкий показатель? – JRodDynamite

+0

Это может быть слишком много, но вы можете использовать scipy модуль для проведения статистического анализа. Я не использую его сам, но насколько я знаю, он должен содержать функциональные возможности, которые вам нужны. И он работает нормально с python 3.x и 2.x. –

+1

@Jason: Jeah, на самом деле я имею в виду что-то вроде: их (среднее) количество вхождений (значительно) ниже, чем у другого. Спасибо за прочтение! – EM90

ответ

5
from collections import Counter 

c = Counter("text") 
print(c.most_common()) 

выход

[('t', 2), ('e', 1), ('x', 1)] 
+0

ОП запросил редкие, не самые распространенные. – Duncan

+1

@ Duncan просто отменил список. –

+0

@ Duncan Они равны, просто разные порядки. –

1
d = {} 
for c in open(filename, "r").read(): 
    if c in d: 
     d[c] += 1 
    else: 
     d[c] = 1 

print(d) 

Затем вы можете использовать d для поиска минимальных букв.

1

Вот один из способов сделать это, используя словарь Counter. Он печатает редкие символы вместе с их количеством вхождений. Мы определяем редкий символ, который является числом, число вхождений которого меньше определенного порогового значения, которое представляет собой среднее число случаев, умноженное на весовой коэффициент, который я установил в этом примере равным 0,5.

from collections import Counter 

with open(fname, 'r') as f: 
    text = f.read() 

counter = Counter(text) 
mean = len(text)/len(counter) 
print('Mean:', mean) 

weight = 0.5 
thresh = mean * weight 
print('Threshold:', thresh) 

#Only print results for chars whose occurence is less than the threshold 
for ch, count in reversed(counter.most_common()): 
    if count <= thresh: 
     print('{0!r}: {1}'.format(ch, count)) 
    else: 
     break 

Если это фактический текстовый файл, вы можете отфильтровать определенные символы, например, строки и пробелы.

1

Использование опции collections для доступа к п наименьшее общее элементы c.most_common()[:-n-1:-1]

from collections import Counter 
c = Counter("sadaffdsagfgdfaafsasdfs3213jlkjk22jl31j2k13j313j13") 
res = c.most_common()[:-3-1:-1] 
print "The 3 Rarest characters are:",res[0][0],",",res[1][0],"and",res[2][0] 

Результат:

The 3 Rarest characters are: l , g and k 
+0

почему сортировка отсортированного списка? –

+0

Я сортирую по численному значению вхождения, а не по алфавиту. –

+0

1- '.most_common()' уже возвращает пары, отсортированные по количеству вхождений, например: '.most_common() [- 1]' - самый редкий символ - не нужно вызывать дополнительные 'sort()', чтобы получить 2 редких персонажа. 2- вы можете использовать 'operator.itemgetter (1)' вместо определения функции {возникновения}() '3-3, все ваши строки являются байтами. Вы должны использовать Unicode при обработке текста. 4- ['heapq.nsmallest()' может быть более эффективным, чем вызов '.most_common()] (http://stackoverflow.com/a/35799656/4279) – jfs

1

Чтобы найти 10 редчайшие символов в тексте:

from collections import Counter 

rarest_chars = Counter(text).most_common()[-10:] 

«характер «здесь означает код Unicode для простоты: это означает "a" и "A" считаются разными. Это означает, что u'g̈' (U + 0067 U + 0308) считается двумя символами. Посмотрите, как эти проблемы обрабатываются по соответствующему вопросу: Most common character in a string.

counter.most_common()[-10:] может быть написано более эффективен, используя heapq.nsmallest(10, counter.items(), key=itemgetter(1)) : .items() возвращает пару (character, its_count) и key=itemgetter(1) извлекают отсчеты так, чтобы 10 пара с наименее подсчетами возвращается.

Смежные вопросы