Synteza mowy III: Finał

20.07.2010 - Krzysztof Kercz
TrudnośćTrudność

akcenty.py

Pokaż/ukryj kod źródłowy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#!/usr/bin/python
# -*- coding: utf-8 -*-
 
import re
 
#wczytujemy z pliku słowa, w których akcent nie pada na drugą sylabę
akcenty = set([line.strip().lower().decode('utf-8') 
        for line in open('data/akcenty.txt')])
 
def generate_exception_words(morfologik='morfologik.txt'):
    
    """ Funkcja bierze plik z morfologikiem i drukuje słowa, 
        w których akcent nie jest paroksytoniczny """
    
    for line in open(morfologik):
        try: (word, base, tag) = line.strip().split()
        except: continue
    
        # pmijamy imiona i nazwiska, zostawiając parę nazw własnych
        if (base not in ['Ameryka', 'Afryka', 'Antarktyka', 'Arktyka', 
            'Dominika', 'Korsyka', 'Martynika', 'Mezoameryka', 
            'Palearktyka', 'Panameryka', 'Scholastyka', 'Tanganika'] 
            and (base.lower() != base)):
            continue
        
        for sufix in ['yka', 'ika']:
            if base.endswith(sufix) and tag.split(':')[0] == 'subst':
                print word
                    
#generate_exception_words('morfologik.txt')
 
def akcent(word):
    
'''Funkcja bierze słowo i zwraca, na którą sylabę pada w nim akcent 
   (Oczywiście siłą rzeczy czasem będzie się mylić)'''
    
    if re.search(u'(ła|ło|ły|li)by(śmy|ście)$', word):
        return 4
    
    if (re.search(u'(ła|ło|ły|li|[uaeyięą]ł)by(m|ś)?$', word) or 
        re.search(u'(ły|li)(ście|śmy)$', word)):
        return 3
    
    if re.search(u'[^aeuoióęą]że$', word):
        return 3
    
    if word in akcenty:
        return 3
    
    return 2

O wykrywaniu miejsca sylaby akcentowanej w słowie pisaliśmy w drugiej części cyklu (a dokładniej: tutaj), te rozważania pozwoliły nam stworzyć powyższy moduł.

Główna funkcja - akcent(word) - bierze słowo i określa, która sylaba powinna być w nim zaakcentowana. Schemat działania jest prosty. sprawdzamy najpierw (przy pomocy wyrażeń regularnych), czy słowo nie jest czasownikiem w trybie przypuszczającym (np. zrobilibyście - akcent na czwartą sylabę od końca) bądź w czasie przeszłym liczby mnogiej (np. zrobiliście - akcent na trzecią sylabę). Wyrażenie regularne pozwala nam również wychwycić słowa z partykułą -że (np. zróbże). Następnie sprawdzamy, czy słowo nie należy do grupy wyrazów obcych zakończonych na -yka, -ika.

Ale w jaki sposób to robimy? Dysponujemy plikiem akcenty.txt z listą takich słów, który sami sobie wygenerowaliśmy przy pomocy Morfologika (funkcja generate_exception_words(morfologik)). Pisaliśmy o tym w poprzedniej części: wybieramy rzeczowniki, których mianownik (base) ma interesującą nas końcówkę. Powiedzmy jeszcze, co dzieje się w liniach 15-24: Morfologik rozróżnia duże i małe litery, więc dla przykładu wszystkie nazwiska będą tam podane dużą literą - pomijamy takie słowa (bo np. Baryka chcielibyśmy zaakcentować normalnie), zostawiając jednak nazwy kontynentów, krajów itp.

5
Twoja ocena: Brak Ocena: 5 (1 ocena)

Copyright © 2008-2010 Wrocławski Portal Informatyczny

design: rafalpolito.com