2011-04-05 25 views
6

primero quiero decir que soy un novato en python. Estoy tratando de calcular la distancia de Levenshtein para muchas listas de palabras. Hasta ahora, he logrado escribir el código para un par de palabras, pero estoy teniendo problemas para hacerlo por listas. Acabo de habe dos listas de palabras con uno debajo del otro como esto: Carlos stiv Petercalculando distancia de Levenshtein usando listas de palabras

quiero usar la distancia Levenshtein de un enfoque similitud. ¿Podría alguien decirme cómo puedo cargar las listas y luego usar una función para calcular la distancia?

¡Lo apreciaré!

Aquí está mi código sólo por dos cadenas:

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

def lev_dist(source, target): 
    if source == target: 
     return 0 

#words = open(test_file.txt,'r').read().split(); 

    # Prepare matrix 
    slen, tlen = len(source), len(target) 
    dist = [[0 for i in range(tlen+1)] for x in range(slen+1)] 
    for i in xrange(slen+1): 
     dist[i][0] = i 
    for j in xrange(tlen+1): 
     dist[0][j] = j 

    # Counting distance 
    for i in xrange(slen): 
     for j in xrange(tlen): 
      cost = 0 if source[i] == target[j] else 1 
      dist[i+1][j+1] = min(
          dist[i][j+1] + 1, # deletion 
          dist[i+1][j] + 1, # insertion 
          dist[i][j] + cost # substitution 
         ) 
    return dist[-1][-1] 

if __name__ == '__main__': 
    import sys 
    if len(sys.argv) != 3: 
     print 'Usage: You have to enter a source_word and a target_word' 
     sys.exit(-1) 
    source, target = sys.argv[1], sys.argv[2] 
    print lev_dist(source, target) 
+1

¿Qué quieres hacer? Calcule la distancia para cada par en la lista? –

+1

Paso 1. Agregue código para leer su lista (¿o son dos listas?). Paso 2. Agregue un ciclo para iterar a través de su lista (¿o son dos listas?). Paso 3. Publica el nuevo código para que podamos comentar sobre él. El código que publicaste es bueno, pero también debes escribir las dos partes siguientes. –

+0

Thans para las respuestas rápidas. Larsmans: quiero calcular la distancia para cada palabra de una lista a cada palabra de la segunda lista. S.Lott: ¡hay dos listas! –

Respuesta

7

finalmente me dieron el código de trabajo con la ayuda de un amigo :) Puede calcular la distancia de Levenshtein y compararla con cada palabra de la segunda lista cambiando la última línea del guión, es decir: print (list1 [0], list2 [i]), para comparar la primera palabra de la lista1 con cada palabra en list2.

Gracias

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

import codecs 

def lev_dist(source, target): 
    if source == target: 
     return 0 


    # Prepare a matrix 
    slen, tlen = len(source), len(target) 
    dist = [[0 for i in range(tlen+1)] for x in range(slen+1)] 
    for i in xrange(slen+1): 
     dist[i][0] = i 
    for j in xrange(tlen+1): 
     dist[0][j] = j 

    # Counting distance, here is my function 
    for i in xrange(slen): 
     for j in xrange(tlen): 
      cost = 0 if source[i] == target[j] else 1 
      dist[i+1][j+1] = min(
          dist[i][j+1] + 1, # deletion 
          dist[i+1][j] + 1, # insertion 
          dist[i][j] + cost # substitution 
         ) 
    return dist[-1][-1] 

# load words from a file into a list 
def loadWords(file): 
    list = [] # create an empty list to hold the file contents 
    file_contents = codecs.open(file, "r", "utf-8") # open the file 
    for line in file_contents: # loop over the lines in the file 
     line = line.strip() # strip the line breaks and any extra spaces 
     list.append(line) # append the word to the list 
    return list 

if __name__ == '__main__': 
    import sys 
    if len(sys.argv) != 3: 
     print 'Usage: You have to enter a source_word and a target_word' 
     sys.exit(-1) 
    source, target = sys.argv[1], sys.argv[2] 

    # create two lists, one of each file by calling the loadWords() function on the file 
    list1 = loadWords(source) 
    list2 = loadWords(target) 

    # now you have two lists; each file has to have the words you are comparing on the same lines 
    # now call you lev_distance function on each pair from those lists 

    for i in range(0, len(list1)): # so now you are looping over a range of numbers, not lines 
     print lev_dist(list1[0], list2[i]) 


# print lev_dist(source, target) 
5
+7

A veces un buen consejo, pero también es la mejor manera de aprender cómo funcionan las ruedas ... – grifaton

+2

sí, sé sobre el módulo, ¡solo quería hacerlo yo solo para aprender Python! –

+6

esto no funciona para las listas! – ingrid

Cuestiones relacionadas