En varias áreas de la computación, como la recuperación de información (ej.: buscadores de documentos web), es indispensable comparar textos. Saber si dos textos son exactamente iguales no es tan útil como determinar qué tan similares son. Hay varios algoritmos para determinar qué tan similares o distintos son dos textos. Uno de ellos es la distancia basada en bigramas.
Un bigrama es un par de caracteres consecutivos pertenecientes a un término (o palabra). Por ejemplo, AR es un bigrama dentro de ARROZ, PASEAR, CARTA, y ARMAR, pero no es un bigrama presente en RATA, CAER ni CAMPO.
Para un término o palabra se pueden obtener todos sus bigramas simplemente agrupando sus caracteres consecutivos en pares. Por ejemplo, separar la palabra PAPAYA en bigramas genera los cinco bigramas PA-AP-PA-AY-YA. Para el cálculo de la distancia de bigramas es útil descartar los bigramas reiterados. Conviene construir el conjunto de bigramas de un término, ya que matemáticamente los conjuntos no permiten la repetición de elementos. Si t es el término t = "PAPAYA", su conjunto de bigramas sería T = {PA, AP, AY, YA}. La cantidad de bigramas en el conjunto, conocido cardinalidad |T| es 4 en nuestro ejemplo, uno menos que la lista de 5 bigramas original, dado que el bigrama PA estaba repetido.
Supóngase que queremos comparar dos términos t1 y t2 para saber qué tan distintos son. La distancia de bigramas entre ellos sería un número real entre [0, 1], donde un valor cercano a 1 indicaría que los textos tienen poco en común (mayor distancia), y un valor cercano a 0, indicaría que los textos tienen mucho en común (menor distancia), y se calcula con la relación:
donde t1 y t2 son los términos a comparar, T1 y T2 son sus respectivos conjuntos de bigramas, |T1| y |T2| son las cardinalidades de esos conjuntos, y |T1 ∩ T2| es la cardinalidad de la intersección entre ambos conjuntos, es decir, la cantidad de bigramas en común entre ambos términos.
Por ejemplo, si la primera palabra a comparar es t1 = PAPAYA, su conjunto de bigramas sería T1 = {PA, AP, AY, YA} y su cardinalidad sería |T1| = 4. Si la segunda palabra a comparar es t2 = PAYASO, su conjunto de bigramas sería T2 = {PA, AY, YA, AS, SO} y su cardinalidad sería |T2| = 5. La intersección de ambos conjuntos es T1 ∩ T2 = {PA, AY, YA} y su cardinalidad es |T1 ∩ T2| = 3. Por lo tanto, la distancia de bigramas entre ambos términos sería:
La siguiente tabla muestra la distancia de bigramas entre t1 = PAPAYA y otros términos, entre los cuales, el más similar es PAYASO y el más distinto es RATA:
| t2 | T2 | |T2| | T1 ∩ T2 | |T1 ∩ T2| | d(t1, t2) |
|---|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Elabore un programa que calcule la distancia de bigramas entre el término que recibe en la primera línea de la entrada estándar (llamado término de referencia), contra los términos que vienen en las siguientes líneas (términos a comparar). Compare también el término de referencia contra sí mismo, para comprobar que su distancia es 0.
| Ejemplo de entrada | Ejemplo de salida |
|---|---|
PAPAYA PAYASO KAYAK RATA AY |
PAPAYA PA-AP-AY-YA 0 PAYASO PA-AY-YA-AS-SO 0.333333 KAYAK KA-AY-YA-AK 0.5 RATA RA-AT-TA 1 AY AY 0.6 |
Se quiere que el programa muestre en la salida estándar cada término a comparar, su conjunto de bigramas, y la distancia de bigrama respecto al término de referencia.
Evaluación
En cada uno de los rubros siguientes se evalúan las buenas prácticas de programación que influyen en la calidad, eficiencia, y reutilización del código. Nota: no es necesario que documente con Doxygen.
-
[10%] Subrutina principal. Compara el término de referencia contra todas los demás en las líneas de la entrada.
-
[20%] Representa un término y su conjunto de bigramas. Libera memoria.
-
[15%] Lee términos desde la entrada estándar. Imprime su texto y conjunto de bigramas en la salida estándar.
-
[20%] Separa los bigramas y los agrega al conjunto sin permitir repetidos.
-
[20%] Calcula la distancia de bigramas entre dos términos. Calcula la cardinalidad de la intersección de los conjuntos de bigramas.
-
[15%] Representa bigramas. Permite compararlos. Imprime bigramas en la salida estándar.