¿Buscando en un archivo .txt y comparando los dos valores de una cadena en python?

"cadence_regulatable_result": "completeRecognition", "appserver_results": { "status": "success", "final_response": 0, "payload": { "actions": [{ "speaker": "user", "type": "conversation", "nbest_text": { "confidences": [478, 0, 0], "words": [[{ "stime": 0, "etime": 1710, "word": "ConnectedDrive\\*no-space-before", "confidence": "0.241" }], [{ "stime": 0, "etime": 1020, "word": "Connected\\*no-space-before", "confidence": "0.0" }, { "stime": 1020, "etime": 1710, "word": "drive", "confidence": "0.0" }], [{ "stime": 0, "etime": 900, "word": "Connect\\*no-space-before", "confidence": "0.0" }, { "stime": 900, "etime": 980, "word": "to", "confidence": "0.0" }, { "stime": 980, "etime": 1710, "word": "drive", "confidence": "0.0" }]], "transcriptions"= ["ConnectedDrive", "Connected drive", "Connect to drive"] } }] } }, "final_response": 0, "prompt": "", "result_format": "appserver_post_results" }: form-data;name="QueryResult"Content-Type: application/JSON;charset=utf-8Nuance-Context: efb3d3ce-ef50-4e83-8c31-063c3f5208aa{ "status_code": 0, "result_type": "DRAGON_NLU_ASR_CMD", "NMAS_PRFX_SESSION_ID": "f786f0be-d547-4fca-8d72-96429a30c9db", "NMAS_PRFX_TRANSACTION_ID": "1", "audio_transfer_info": { "packages": [{ "time": "20151221085512579", "bytes": 1633 }, { "time": "20151221085512598", "bytes": 3969 }], "nss_server": "10.56.11.186:4503", "end_time": "20151221085512596", "audio_id": 1, "start_time": "20151221085512303" }, "cadence_regulatable_result": "completeRecognition", "appserver_results": { "status": "success", "final_response": 1, "payload": { "diagnostic_info": { "adk_dialog_manager_status": "undefined", "nlu_version": "[NLU_PROJECT:NVCCP-eng-USA];[D0160932];[VL-Models:Version: vl.1.100.12-2-GMT20151130160335]", "nlps_host": "mt-dmz-nlps002.nuance.com:8636", "nlps_ip": "10.56.10.51", "application": "AUDI_2017", "nlu_component_flow": "[Input:VoiceJSON] [FieldID|auto_main] [NLUlib|C-eckart-r$Rev$.f20151118.1250] [build|G-r72490M.f20151130.1055] [vlmodel|Version: 2-GMT20151130160335] [Flow|+VlingoTokenized]", "third_party_delay": "0", "nmaid": "AUDI_SDS_2017_EXT_20151203", "nlps_profile": "AUDI_2017", "fieldId": "auto_main", "nlps_profile_package_version": "r159218", "nlu_annotator": "com-GBR.ncs51.VlingoNLU-client-qNVCCP_NCS51", "ext_map_time": "2", "nlu_use_literal_annotator": "0", "int_map_time": "2", "nlps_nlu_type": "nlu_project", "nlu_language": "eng-GBR", "timing": { "finalRespSentDelay": "188", "intermediateRespSentDelay": "648" }, "nlps_profile_package": "AUDI_2017" }, "actions": [{ "Input": { "Interpretations": ["ConnectedDrive"], "Type": "asr" }, "Instances": [{ "nlu_classification": { "Domain": "UDE", "Intention": "Unspecified" }, "nlu_interpretation_index": 1, "nlu_slot_details": { "Name": { "literal": "ConnectedDrive" }, "Search-phrase": { "literal": "connecteddrive" } }, "interpretation_confidence": 4549 }], "type": "nlu_results", "api_version": "1.0" }], "nlps_version": "nlps(z):6.1.100.12.2-B359;Version: nlps-base-GMT20151130193521;" } }, 

En primer lugar, estoy buscando transcripciones e interpretaciones en el archivo .txt (Por lo tanto, estoy usando expresiones regulares), luego quiero comparar el PRIMER valor de las transcripciones (“Llevarme a una estación de carga”) con el valor de Interpretaciones (“Conducir a una estación de carga “). Si doy lo siguiente en mi progtwig, es solo imprimiendo ya que el Reconocimiento es NO VÁLIDO

 directory =os.path.join("C:\Users\hemanth_venkatappa\Desktop\Working\pcm-audio\English") for subdir, dirs, files in os.walk(directory): for file in files: if file.endswith(".txt"): content=json.load(file) if "status_code" in content: if content["status_code"]==0: print("valid") 

Puedes echar un vistazo a difflib para la comparación de texto usando Python.

El módulo difflib contiene herramientas para calcular y trabajar con diferencias entre secuencias. Es especialmente útil para comparar texto e incluye funciones que producen informes utilizando varios formatos de diferencias comunes.

tutorial difflib

Usando este módulo puedes evaluar las diferencias entre dos cadenas o archivos .txt esta manera:

 import difflib a = ["Drive me to a charging station", "Drive me to charging station", "Drive me to a charging Station"] correct = ["Drive me to a charging station"] print difflib.SequenceMatcher(None, a[0], correct[0]).ratio() >> 1.0 print difflib.SequenceMatcher(None, a[1], correct[0]).ratio() >> 0.965517241379 print difflib.SequenceMatcher(None, a[2], correct[0]).ratio() >> 0.966666666667 

Como puede ver, el .ratio() entre a[0] y el correct es 1.0 o 100%. Esto significa que son la misma cadena.

Puede usar un loop para evaluate the ratios y if ratio == 1.0 , print "Recognition is VALID "

Además, si no quieres usar el .ratio( ) entre las cadenas, puedes verificar las diferencias usando:

 d = difflib.Differ() diff = d.compare(a, correct) print '\n'.join(diff) 

Y este bloque de código me da:

  Drive me to a charging # no signal at the start means it's the same string - Drive me to charging station # this string has less chars than the expected string - Drive me to a charging Station # same here 

Entonces tendrá que encontrar una manera de imprimir. El Recognition is VALID or INVALID acuerdo con sus expectativas.

Esto parece ser JSON. Debería poder cargar todo el archivo en un diccionario con:

 import json data = json.load(f) 

Ahora los data contienen un diccionario de otros diccionarios y listas. Necesitas encontrar tu camino explorando el diccionario.

Similar a ésto:

 interpretations = data["appserver_results"]["actions"][0]["Input"]["Interpretations"] transcriptions = (data["cadence_regulatable_result"]["completeRecognition"]["appserver_results"] ["payload"]["actions"][0]["nbest_text"]["transcriptions"]) 

Necesita ajustarse a sus datos reales. Juegue en el indicador interactivo para averiguar qué claves e índices necesita usar.

Ahora verifica si está contenido:

 if interpretations[0] in transcriptions: print('found', interpretations[0] ) 

Su progtwig final puede parecerse a esto:

 def find_interpretations(fobj): data = json.load(fobj) interpretations = data["appserver_results"]["actions"][0]["Input"]["Interpretations"] transcriptions = (data["cadence_regulatable_result"]["completeRecognition"]["appserver_results"] ["payload"]["actions"][0]["nbest_text"]["transcriptions"]) if interpretations[0] in transcriptions: return interpretations[0] return None for subdir, dirs, files in os.walk(directory): for file in files: if file.endswith(".txt"): file_name = os.path.join(subdir, file) with open(file_name) as fobj: found = find_interpretations(fobj) if found: print('found: {} in file: {}'.format(found, file_name) 

Dado que los bashs con difflib y json llevaron a ninguna parte, esto se basa en su enfoque original de la revisión 2 de su pregunta; básicamente solo usa re.search lugar de re.findall para verificar si la primera transcripción es igual a la interpretación:

 #!/usr/bin/env python3 import os import re directory = os.path.join("../data/English") for subdir, dirs, files in os.walk(directory): for file in files: if file.endswith(".txt"): f = open(os.path.join(subdir, file),'r') a = f.read() if re.findall('\"status_code\": 0', a): print('Status is Valid') else: print('Status is Invalid') m = re.search('"transcriptions"= ."(.*)"', a) if m and re.search('"Interpretations": ."'+m.group(1), a): print('Recognition is VALID') else: print('Recognition is INVALID')