Definiciones de palabras en español con Python

Código fuente escrito en Python, que retorna el significado de la palabra que le indiquemos. En un principio la aplicación no consta de definiciones registradas, de modo que se conectará a la página de la Real Academia Española en busca del significado de dicha palabra para registrarla posteriormente. Al inicio actuara recurcivamente en busca del significado de cada una de las palabras contenidas en el texto de la definición obtenida, creando un registro bien amplio en un archivo 'registro.dat' del mismo directorio. Después de un tiempo, ya no será necesario la conexión a Internet para obtener las definiciones.


#!/usr/bin/env python
# -*- coding: utf-8 -*-


__date__ = "2012"

import urllib2
import time
import string
import cPickle as pickle

numero_registros = 0
CARACTERES_ESPECIALES = string.punctuation + string.whitespace

class Base(String):

    def __init__(self):
        self.coincidencias = []

    def Dic(self, palabra):
        """Funcion base del programa."""
        palabra = self.GetPalabraUnica(palabra)
        if not palabra:
            return
        print ">>>", palabra
        definicion = self.IsPalabra(palabra)
        if not definicion:
            if self.IsPalabraSinDefinicion(palabra):
                print(">>> Palabra sin definicion!")
                return
            print(">>> Palabra no registrada. Buscando en la web........")
            definicion = self.Buscar(palabra)
            if not definicion:
                print(">>> Palabra no encontrada!.. Algunas coincidencias:")
                for pal in self.coincidencias:
                    print(pal)
                return
            self.RegistrarPalabra(palabra, definicion)
        return definicion

    def GetPalabraUnica(self, palabra):
        """Obtine la primera palabra indicada en caso de ser varias.. hasta
        encontrar el primer caracter especial en ella en caso de"""
        palabra_nueva = ""
        for letra in palabra.lower().lstrip():
            if letra in CARACTERES_ESPECIALES:
                return palabra_nueva
            palabra_nueva += letra
        return palabra_nueva

    def RegistrarPalabra(self, palabra, definicion):
        """Registra la palabra en el programa"""
        global numero_registros
        numero_registros += 1
        archivo = file("registro.dat", "r")
        registro = pickle.load(archivo)
        archivo.close()
        registro[palabra] = definicion
      
        archivo = file("registro.dat", "w")
        pickle.dump(registro, archivo)
        archivo.close()
        return True

    def GetDefinicion(self, datos):
        """Obtine la definicion desde la pagina html fuente obtenida"""
        corte1 = datos[datos.find('eAcep') : ]
        definicion = corte1[corte1.find('eAcep')+8 : corte1.find('<')]
        return definicion

    def GetCoincidencia(self, datos):
        """Obtine las considencias debueltas por la pagina en caso de no haber
        sido encontrada la palabra."""
        pos = 0
        self.coincidencias = []
        for n in range(datos.count("LEMA")):
            indice1 = string.find(datos, "LEMA=", pos)
            indice2 = string.find(datos, " target=", pos)
            palabra = datos[indice1+5 : indice2-1]
            self.coincidencias.append(palabra)
            pos = indice2+7
            if len(str(self.coincidencias)) > 100:
                self.coincidencias = []
        return self.coincidencias
      
    def IsPalabra(self, palabra):
        """Comprueba si la palabra ya esta registrada devolviendo su definicion.
        en caso de no estar registrada devuelve False"""
        try:
            archivo = file("registro.dat", "r")
        except IOError:
            archivo = file("registro.dat", "w")
            pickle.dump({}, archivo)
            archivo.close()
            return False
        registro = pickle.load(archivo)
        archivo.close()
        try:
            return registro[palabra.lower()]
        except KeyError:
            return False
          
    def IsPalabraSinDefinicion(self, palabra):
        try:
            archivo = file("sin_definicion.dat", "r")
        except IOError:
            archivo = file("sin_definicion.dat", "w")
            pickle.dump([], archivo)
            archivo.close()
            return
        palabras = pickle.load(archivo)
        archivo.close()
        if palabra in palabras:
            return True
          
    def SetPalabraSinDefinicion(self, palabra):
        """Guarda la palabra en el archivo de las palabras sin definicion."""
        archivo = file("sin_definicion.dat", "r")
        palabras = pickle.load(archivo)
        archivo.close()
        palabras.append(palabra)
        archivo = file("sin_definicion.dat", "w")
        pickle.dump(palabras, archivo)
        archivo.close()

    def Buscar(self, palabra):
        """Realiza la busqueda de la palabra en la web 
        funcion solo para la web http://buscon.rae.es/"""
        try:
            #f = urllib2.urlopen("http://buscon.rae.es/draeI/SrvltGUIBusUsual?TIPO_HTML=2&TIPO_BUS=3&LEMA=%s" % palabra)
            #f = urllib2.urlopen("http://buscon.rae.es/draeI/SrvltConsulta?TIPO_BUS=3&LEMA=%s" % palabra)
            f = urllib2.urlopen("http://buscon.rae.es/draeI/SrvltGUIBusUsual?LEMA=%s&origen=RAE&TIPO_BUS=3" % palabra)
            datos = f.read()
            f.close()
        except BaseException as e:
            print("Error obteniendo resultados.. URLError")
            print(e)
            return
        if datos.find("RC_NF") != -1:
            print("La busqueda de la palabra no obtubo resultados!")
            self.SetPalabraSinDefinicion(palabra)
            return
        if datos.find("eAcep") == -1:
            print(u"Sin resultados!")
            self.GetCoincidencia(datos)
            return
        return self.GetDefinicion(datos)
  
    def GetPalabrasRegistradas(self):
        """Obtine las palabras registradas"""
        archivo = file("registro.dat", "r")
        registro = pickle.load(archivo)
        archivo.close()
        return registro.keys()
      
    def GetCantidadPalabrasRegistradas(self):
        """Obtine la cantidad de palabras registradas"""
        return len(self.GetPalabrasRegistradas())
  


dic = Base()
palabras_registradas = dic.GetPalabrasRegistradas()
numero_registros = len(palabras_registradas)
for palabra in palabras_registradas:
    print(palabra)
print("Cantidad de palabras registradas:  %d \n" % numero_registros)

def busqueda(palabra):
    defi = dic.Dic(palabra)
    return defi

def main(palabra):
    defi = busqueda(palabra)
    if not defi:
        return
    print defi
    print("%d palabras registradas" % numero_registros)
    palabras = defi.split(" ")
    for pal in palabras:
        pal1 = dic.IsPalabra(pal)
        if pal1:
            print pal, "(ya esta registrada)"
            continue
        print pal
        try:
            main(pal)
        except RuntimeError:
            break
    return 0
     
while True:
    main(raw_input("Buscar: ")