Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 26, 2013 01:22:24

Kato
Зарегистрирован: 2012-11-26
Сообщения: 22
Репутация: +  0  -
Профиль   Отправить e-mail  

Регулярные выражения, словарь, частотный список.

Всем здравствуйте!
Не могли бы Вы, пожалуйста, помочь с таким вот заданием:
в тексте находятся слова с минимум двумя гласными в начале или конце слова; они записываются в словарь; создается частотный список этих слов и записывается в csv-файл.
Собственно, интересует, как нужно записывать в словарь и далее сделать список? Совсем нчиего не понимаю -_-
Вот все мои отрывки кода:

import codecs, re
f = codecs.open(u'text.txt', 'r', 'utf-8')
words = []
d = {}
frequency = 0
for line in f:
   for word in line.split():
        word = word.lower()
        word = word.strip(u'.,:;-()?!')
        words.append(word)
f.close()
for i in range(len(words)):
    v = u'(^[аеёиоуыэюя]{2,})|([аеёиоуыэюя]{2,}$)'
    m = re.findall(v, words[i])
if m != []:
    for key in words:
        if key in d:
            value = d[key]
            
f = open(u'dict.csv', 'w', 'utf')
f.close()

Офлайн

#2 Фев. 26, 2013 01:45:35

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Регулярные выражения, словарь, частотный список.

Kato
у вас слова, которые прошли регулярное выражение нигде не накапливаются. Переменная m каждый раз затирается новым списком.

То что вы называете частотным списком, думаю нужно обратить внимание на itertools.groupby()



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Фев. 26, 2013 01:57:34

Kato
Зарегистрирован: 2012-11-26
Сообщения: 22
Репутация: +  0  -
Профиль   Отправить e-mail  

Регулярные выражения, словарь, частотный список.

а можно просто freuqency += 1, когда слово встречается снова?
и потмо в словаре как-нибудь упорядочить по этому значению для каждого

Офлайн

#4 Фев. 26, 2013 02:08:22

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Регулярные выражения, словарь, частотный список.

Я кажется понял что вам нужно:

# -*- coding: utf-8 -*-
import codecs, re
d = {}
v=u'([аеёиоуыэюя]{2,}.*[аеёиоуыэюя]{2,})' 
with codecs.open(u'text.txt', 'r', 'utf-8') as f:
    for line in f:
        for word in line.split():
            word = word.lower().strip(u'.,:;-()?!')
            
            if re.match(v, word):
                if d.has_key(word):
                    d[word]+=1
                else:
                    d[word]=1
for key, value in d.items():
    print '{} = {}'.format(key, value)

А по поводу CSV, для начала прочитайте что это такое, что бы понимать. Для python есть разные модули для работы с CSV, можно начать с
import csv



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Отредактировано JOHN_16 (Фев. 26, 2013 02:09:35)

Офлайн

#5 Фев. 26, 2013 02:17:05

Kato
Зарегистрирован: 2012-11-26
Сообщения: 22
Репутация: +  0  -
Профиль   Отправить e-mail  

Регулярные выражения, словарь, частотный список.

Спасибо! а не могли бы, пожалуйста, рассказать про with и as?
с записью файла вопросов пока нет, подобное делали и в общем-то,представляю- просто не стал расписывать, пока наболевшие темы непонятны

Офлайн

#6 Фев. 26, 2013 02:29:13

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Регулярные выражения, словарь, частотный список.

документация и интернет расскажет больше и лучше, в данном случае основное его предназначение сделать код более красивым и автоматически закрыть файл после выполнения кода внутри блока.

Если вам надо еще и отсортировать по частоте слов, то нужно использовать функцию сортировки sorted():

for key, value in sorted(d.items(), key=lambda x: x[1], reverse=True):
    print '{} = {}'.format(key, value)

Да и кстати, если я вам помог, поставьте плюсик в карму, я все таки трачу свое время и внимание к вашей проблеме, а это будет вашей платой мне.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#7 Фев. 26, 2013 04:03:38

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Регулярные выражения, словарь, частотный список.

JOHN_16
Зачем рекомендуете has_key для словаря, она же deprecated.
defaultdict(int) для данной задачи более уместен, а Counter еще больше упрощает реализацию

# -*- coding: utf-8 -*-
import codecs, re
from collections import defaultdict, Counter
from operator import itemgetter
def words(fname):
    with codecs.open(fname, 'r', 'utf-8') as f:
        for line in f:
            for word in line.split():
                yield word.lower().strip(u'.,:;-()?!')
# вариант с defaultdict
def  freuqency(words):
    template = re.compile(u'([аеёиоуыэюя]{2,}.*[аеёиоуыэюя]{2,})').match
    result = defaultdict(int)
    for word in filter(template, words):
        result[word] += 1
    return result
# вариант с Counter
def  freuqency(words):
    template = re.compile(u'([аеёиоуыэюя]{2,}.*[аеёиоуыэюя]{2,})').match
    return Counter(filter(template, words))

# вывод результата
for key, value in sorted(freuqency(words('text.txt')).items(), key=itemgetter(1), reverse=True):
    print '{} = {}'.format(key, value)



Отредактировано pyuser (Фев. 26, 2013 04:06:13)

Офлайн

#8 Фев. 26, 2013 23:18:49

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Регулярные выражения, словарь, частотный список.

pyuser
соглашусь с вами, и работает быстрее.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#9 Март 3, 2013 01:38:29

Kato
Зарегистрирован: 2012-11-26
Сообщения: 22
Репутация: +  0  -
Профиль   Отправить e-mail  

Регулярные выражения, словарь, частотный список.

а вот, к примеру, если с помощью re.sub нужно заменить “коа” на “пёс”, что нужно указать в регулярном , чтобы он не менял и слово “котовый”?

Офлайн

#10 Март 3, 2013 03:54:23

smoke853
Зарегистрирован: 2012-10-02
Сообщения: 123
Репутация: +  15  -
Профиль   Отправить e-mail  

Регулярные выражения, словарь, частотный список.

например так:

import re
s = 'коала, коа, котовый, акоазм'
print(re.sub(r'\bкоа\b', 'пёс', s))

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version