Найти - Пользователи
Полная версия: Регулярные выражения, словарь, частотный список.
Начало » Центр помощи » Регулярные выражения, словарь, частотный список.
1 2
Kato
Всем здравствуйте!
Не могли бы Вы, пожалуйста, помочь с таким вот заданием:
в тексте находятся слова с минимум двумя гласными в начале или конце слова; они записываются в словарь; создается частотный список этих слов и записывается в 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()
JOHN_16
Kato
у вас слова, которые прошли регулярное выражение нигде не накапливаются. Переменная m каждый раз затирается новым списком.

То что вы называете частотным списком, думаю нужно обратить внимание на itertools.groupby()
Kato
а можно просто freuqency += 1, когда слово встречается снова?
и потмо в словаре как-нибудь упорядочить по этому значению для каждого
JOHN_16
Я кажется понял что вам нужно:
# -*- 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
Kato
Спасибо! а не могли бы, пожалуйста, рассказать про with и as?
с записью файла вопросов пока нет, подобное делали и в общем-то,представляю- просто не стал расписывать, пока наболевшие темы непонятны
JOHN_16
документация и интернет расскажет больше и лучше, в данном случае основное его предназначение сделать код более красивым и автоматически закрыть файл после выполнения кода внутри блока.

Если вам надо еще и отсортировать по частоте слов, то нужно использовать функцию сортировки sorted():
for key, value in sorted(d.items(), key=lambda x: x[1], reverse=True):
    print '{} = {}'.format(key, value)

Да и кстати, если я вам помог, поставьте плюсик в карму, я все таки трачу свое время и внимание к вашей проблеме, а это будет вашей платой мне.
pyuser
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)
JOHN_16
pyuser
соглашусь с вами, и работает быстрее.
Kato
а вот, к примеру, если с помощью re.sub нужно заменить “коа” на “пёс”, что нужно указать в регулярном , чтобы он не менял и слово “котовый”?
smoke853
например так:
import re
s = 'коала, коа, котовый, акоазм'
print(re.sub(r'\bкоа\b', 'пёс', s))
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB