3ENGINE

Programación y otros cachivaches

Archivo

Página 13/104

Tecnologia

Cómo habilitar aplicaciones de 32 bits en IIS7


Si tienes IIS en un Windows 64 bits y necesitas ejecutar una aplicación que es para 32 bits. No hay problema, sigue estos pasos.

Habilitar aplicaciones de 32 bits en IIS7

1. Abre el administrador de Internet Information Services (IIS). Lo puedes encontrar en el panel de herramientas administrativas. Una vez dentro, vete a Conexiones y haz click en Grupos de aplicaciones

2. En el panel de la derecha selecciona el grupo de aplicaciones que necesites.

3. Finalmente haz click en Configuración avanzada y cambia la opción Habilitar apllicaciones de 32 bits a True

Cómo habilitar aplicaciones de 32 bits en IIS7




Tecnologia

Cómo configurar un CGI en IIS7


CGI viene de Common Gateway Interface. Fueron una de las primeras tecnologías de la WWW que permitia a un navegador web solicitar datos de un programa ejecutado en un servidor web. Hoy en día esta en desuso, pero si por algún motivo necesitas hacerlo funcionar, te explico cómo configurar un CGI en IIS7.

Instalar (o configurar) IIS7

Instalar IIS7 desde la pantalla Activar o desactivar características de Windows que se encuentra en Programas y características de Windows 7. Para poder configurar un CGI es necesario activar las opciones CGI, Extensiones y Filtros ISAPI

Cómo configurar un CGI en IIS7

Edita las restricciones de ISAPI y CGI

Abre IIS7, haz doble click en el nombre del servidor en la parte superior y por último click en la opción Restricciones de ISAPI y CGI

Cómo configurar un CGI en IIS7

Ahora agrega una restricción, selecciona tu CGI (que normalmente tendrá extensión .dll o .exe) y activa la casilla Permitir ejecución de la ruta de extensión

Cómo configurar un CGI en IIS7

Edita tu aplicación Web para permitir ejecutar un CGI

Pero por defecto IIS7 no permite que una aplicación ejecute un CGI. Ahora en IIS7 selecciona tu aplicación y doble click en la opción Asignaciones de controlador

Cómo configurar un CGI en IIS7

Una vez dentro modifica los permisos de características del controlador CGI-exe y activa la casilla Ejecutar

Cómo configurar un CGI en IIS7

 

Reinicia IIS7

Para asegurar que IIS7 queda perfectamente configurado es recomendable reiniciarlo. Esto lo puedes hacer bien desde la propia consola de administración de IIS7 o bien desde la consola de comandos con la orden iisreset
 

Habilitar CGI de 32 bits

Si el CGI es una aplicación de 32 bits y IIS es de 64 bits no funcionará sino habilitas la opción. Si quieres saber cómo hacerlo te explico cómo habilitar aplicaciones de 32 bits en II7




Tecnologia

Stemming con Python


Stemming

Según la wikipedia Stemming es un método para reducir una palabra a su raíz o (en inglés) a un stem o lema. Hay algunos algoritmos de stemming que ayudan en sistemas de recuperación de información. Stemming aumenta el recall que es una medida sobre el número de documentos que se pueden encontrar con una consulta. Por ejemplo una consulta sobre bibliotecas también encuentra documentos en los que solo aparezca bibliotecario porque el stem de las dos palabras es bibliotec. Mas información en la Wikipedia.

Lematización

Existe otro método llamado Lematización que se diferencia del Stemming en que dada una forma flexionada (es decir, en plural, en femenino, conjugada, etc), halla el lema que por convenio se acepta como representante de todas las formas flexionadas de una misma palabra. Es decir, el lema de una palabra es la palabra que nos encontraríamos como entrada en un diccionario tradicional: singular para sustantivos, masculino singular para adjetivos, infinitivo para verbos. Por ejemplo, decir es el lema de dije, pero también de diré o dijéramos; guapo es el lema de guapas; mesa es el lema de mesas. Mas información en la Wikipedia.

Implementación de Stemming en Python

Es posible realizar Stemming mediante un algoritmo que use reglas gramaticales de derivación morfológica para el idioma en cuestión, o bien usando un diccionario informatizado que asocie a cada forma su lema (palabra) representante. Para el primera solución Snowball (Github) es un pequeño lenguaje de procesamiento implementado en ANSI C para la creación y uso de algoritmos de stemming. Después disponemos de PyStemmer (Github) que es un wrapper de Snowball para python.

Instala PyStemmer con Pip

pip install pystemmer

Nota: Si durante la instalación de PyStemmer se produce un error de este estilo es porque PyStemmer necesita un compilador de C++ para Python. Sigue las instrucciones :

error: Microsoft Visual C++ 9.0 is required (Unable to find vcvarsall.bat). 
Get it from http://aka.ms/vcpython27

Test:

# idiomas disponibles
>>> import Stemmer
>>> print(Stemmer.algorithms())
[u'danish', u'dutch', u'english', u'finnish', u'french', u'german', u'hungarian',
 u'italian', u'norwegian', u'porter', u'portuguese', u'romanian', u'russian',
 u'spanish', u'swedish', u'turkish']

# stem de la palabra en inglés 'cycling'
>>> import Stemmer
>>> stemmer = Stemmer.Stemmer('english')
>>> print(stemmer.stemWord('cycling'))
cycl

# stem de varias palabras en inglés 
>>> import Stemmer
>>> stemmer = Stemmer.Stemmer('english')
>>> print(stemmer.stemWords(['cycling', 'cyclist']))
['cycl', 'cyclist']

# Permite codificación UTF-8
>>> import Stemmer
>>> stemmer = Stemmer.Stemmer('english')
>>> print(stemmer.stemWords(['cycling', u'cyclist']))
['cycl', u'cyclist']

# Por defecto la caché de palabras es de 10000, pero
# se puede modificar
>>> import Stemmer
>>> print(stemmer.maxCacheSize)
10000
>>> stemmer.maxCacheSize = 1000
>>> print(stemmer.maxCacheSize)
1000

# Otro ejemplo en español
>>> import Stemmer
>>> stemmer = Stemmer.Stemmer('spanish')
>>> print stemmer.stemWords(['camionero','camiones','camion','camionera'])
>>> print stemmer.stemWords(['frutal','frutas','frutivoro','abcde'])
['camioner', 'camion', 'camion', 'camioner']
['frutal', 'frut', 'frutivor', 'abcde']

Ejemplo busqueda por palabra clave

import Stemmer

pelis = {u"La reina de Montana": u"Sierra Nevada Jones llega a Montana con su padre para tomar posesión de unas tierras que han pertenecido a sus familias durante generaciones",
         u"La carpa invisible": u"Historia de una circo familiar Los Magote Pablo el director y maestro de ceremonias su esposa la payasa y acróbata Margarita y sus hijos",
         u"Familia": u"Santiago después de levantarse baja a la cocina donde lo espera su familia para felicitarlo es su cumpleaños"}
keywrd = "familiar"

stemmer = Stemmer.Stemmer('spanish')
lemkw = stemmer.stemWord(keywrd)
print "keyword:", keywrd
print "keyword lem:", lemkw
print
for peli in pelis:
    lems = stemmer.stemWords(pelis[peli].split())
    print "title:",
    print "argument", pelis[peli]
    print "argument lem:", lems
    if lemkw in lems:
        print "keyword lem", lemkw, "encontrado en argument lem"
    print

Resultado:

keyword: familiar
keyword lem: famili

title: argument Historia de una circo familiar Los Magote Pablo el director y maestro de ceremonias su esposa la payasa y acróbata Margarita y sus hijos
argument lem: [u'Histori', u'de', u'una', u'circ', u'famili', u'Los', u'Magot', u'Pabl', u'el', u'director', u'y', u'maestr', u'de', u'ceremoni', u'su', u'espos', u'la', u'payas', u'y', u'acrobat', u'Margarit', u'y', u'sus', u'hij']
keyword lem famili encontrado en argument lem

title: argument Sierra Nevada Jones llega a Montana con su padre para tomar posesión de unas tierras que han pertenecido a sus familias durante generaciones
argument lem: [u'Sierr', u'Nev', u'Jon', u'lleg', u'a', u'Montan', u'con', u'su', u'padr', u'par', u'tom', u'posesion', u'de', u'unas', u'tierr', u'que', u'han', u'pertenec', u'a', u'sus', u'famili', u'durant', u'gener']
keyword lem famili encontrado en argument lem

title: argument Santiago después de levantarse baja a la cocina donde lo espera su familia para felicitarlo es su cumpleaños
argument lem: [u'Santiag', u'despues', u'de', u'levant', u'baj', u'a', u'la', u'cocin', u'dond', u'lo', u'esper', u'su', u'famili', u'par', u'felicit', u'es', u'su', u'cumplea\xf1']
keyword lem famili encontrado en argument lem

Como se puede apreciar en el ejemplo al buscar por la palabra clave familiar encuentra coincidencias en el argumento de las tres peículas: familiar, familias y familia.

Este es un ejemplo muy simple. Se podria mejorar eliminando previamente las palabras vacias (stop words), ordenar el resultado según número de coincidencias mediante un algoritmo Tf-idf, o un sistema de retroalimentación aportada por el usuario para indicar la relevancia de los resultados como Rocchio y así mejorar las busquedas.

overstemming y understemming

El stemning presenta dos problemas básicos. El overstemming cuando se reduce demasiado se representa con un mismo stem formas que deberían ser representadas con varios stems y el understemming cuando se reduce poco y se obtienen distintas formas para representar unicamente a una.

Un ejemplo

import Stemmer

stemmer = Stemmer.Stemmer('spanish')
lems = stemmer.stemWords(["familiar", "familias", "familia", "familiares",
                          "familiaridad", "familiaridades"])
print lems
lems = stemmer.stemWords(lems)
print lems

Resultado

['famili', 'famili', 'famili', 'familiar', 'familiar', 'familiar']
['famili', 'famili', 'famili', 'famili', 'famili', 'famili']

Del ejemplo vemos que si aplico dos veces stemming, coinciden las seis formas. Si se aplica sólo una vez se produce un efecto de understemming.




Tecnologia

Cómo buscar videos en Youtube con Python


Si quieres buscar videos de Youtube de manera totalmente automática, Google ofrece su API de Youtube. Una alternativa a esta API es hacer uso de técnicas de Web Scraping para simular que nuestra aplicación es un humano navegando por la Web y recopilar información de forma automática.

buscar videos en Youtube con Python

Vamos a ver como se hace mediante la escritura de un sencillo código Python y el apoyo de la libreria pyquery que permite realizar consultas de manera similar a como lo hace jQuery en documentos XML y HTML.

Si despues te interesa descargar videos de youtube entonces te interesa esta entrada donde explico cómo hacerlo. En cambio, si lo que te interesa es descargar el thumbnail entonces te puede interesar esta otra entrada donde explico cómo bajar una imagen de la web con python.

Código:

# -*- coding: cp1252 -*-
from pyquery import PyQuery as Pq
from urllib import urlencode

def search_youtube_video(title, pages):
    for page in range(pages):
        params = urlencode({'search_query':'intitle:"%s", video, long' % title, 'page':page})
        jq = Pq(url="http://www.youtube.com/results?%s" % params,
                headers={"user-agent": "Mozilla/5.0 (Windows NT 6.1; rv:24.0) Gecko/20140129 Firefox/24.0"})
        jq.make_links_absolute("http://www.youtube.com")
        for video in jq("ol.item-section").children().items():
            url = video.find("a.yt-uix-tile-link").attr("href")
            title = video.find("a.yt-uix-tile-link").text()
            time = video.find("span.video-time").text()   
            if time:
                tsecs = 0
                items = time.split(':')
                items.reverse()
                for i in range(len(items)):
                    tsecs += int(items[i])*(60**i)          
            description = video.find("div.yt-lockup-description").text()
            thumb = video.find("div.yt-thumb img").attr("data-thumb")
            if not thumb:
                thumb = video.find("div.yt-thumb img").attr("src")
            if thumb:
                thumb = thumb.lstrip("//")     
            published = video.find("ul.yt-lockup-meta-info li").eq(0).html()
            views = video.find("ul.yt-lockup-meta-info li").eq(1).html()

            print
            print "url:", url
            print "title:", title
            print "time:", time
            print "time in seconds:", tsecs
            print "description:", description
            print "thumbnail:", thumb
            print "published:", published
            print "views:", views

if __name__ == '__main__':
    search_youtube_video("la guerra del opio", 1)

La función search_youtube_video acepta dos parámetros. title es el texto a buscar y pages el número de páginas de resultados a procesar. El código hace uso de selectores jqyery para encontrar la información en la página de resultados.

El código siempre buscar videos de mas de 20 minutos, para eliminar esta restricción deberás eliminar el keyword «long» del parámetro search_query quedando así:

params = urlencode({'search_query':'intitle:"%s", video' % title, 'page':page})

Resultado ejemplo:

url: http://www.youtube.com/watch?v=436qM17mKok
title: la guerra del opio 1997 dvdripspanishwww zonatorrent com
time: 1:46:38
time in seconds: 6398
description: 
thumbnail: i.ytimg.com/vi/436qM17mKok/mqdefault.jpg
published: Hace 2 años
views: 23.792 visualizaciones

url: http://www.youtube.com/watch?v=0L7l7j9r1hs
title: Escenas para uso didáctico: La Guerra del Opio
time: 47:51
time in seconds: 2871
description: Escenas para explicar el imperialismo colonial. Más información:...
thumbnail: i.ytimg.com/vi/0L7l7j9r1hs/mqdefault.jpg
published: Hace 2 años
views: 5.833 visualizaciones

url: http://www.youtube.com/watch?v=bhnXgV-ZRS0
title: La Guerra del Opio
time: 32:18
time in seconds: 1938
description: mi proyecto Brenda Elena Segura Maza "A"
thumbnail: i.ytimg.com/vi/bhnXgV-ZRS0/mqdefault.jpg
published: Hace 1 año
views: 230 visualizaciones