2016-04-25 21 views
9

più commonly misspelled English words sono entro due o tre errori tipografici (una combinazione di sostituzioni s, inserzioni i o delezioni lettera d ) dalla loro forma corretta. Cioè errori nella coppia di parole absence - absense possono essere riassunti come aventi 1 s, 0 i e 0 d.Come faccio a confondere una parola con una parola intera (e solo una parola intera) in una frase?

È possibile trovare una corrispondenza sfocata per trovare le parole e i loro errori di ortografia utilizzando per sostituire il numeroregex python module.

La tabella seguente riassume i tentativi fatti per segmentare sfocata una parola di interesse da parte di qualche frase:

enter image description here

  • Regex1 trova il miglior word partita in sentence permettendo al massimo 2 errori
  • Regex2 trova la migliore corrispondenza word in sentence consentendo a la maggior parte dei 2 errori durante il tentativo di operare solo su (penso) parole intere
  • Regex3 trova la migliore corrispondenza word in sentence consentendo a la maggior parte di 2 errori mentre funziona solo su (penso) parole intere. Mi sbaglio in qualche modo
  • Regex4 trova il miglior word partita in sentence permettendo al più 2 errori mentre (credo) alla ricerca per la fine della partita per essere un confine di parola

Come vorrei scrivere un'espressione regex che elimina, se possibile, corrispondenze fuzzy false positive e false negative su queste coppie di parole-frasi?

Una possibile soluzione sarebbe quella di confrontare solo parole (stringhe di caratteri circondate da spazi bianchi o l'inizio/fine di una riga) nella frase per la parola di interesse (parola principale). Se c'è una corrispondenza fuzzy (e < = 2) tra la parola principale e una parola nella frase, quindi restituire quella parola completa (e solo quella parola) dalla frase.

Codice

Copiare il seguente dataframe negli appunti:

  word     sentence 
0  cub cadet    cub cadet 42 
1  plastex    vinyl panels 
2   spt heat and air conditioner 
3  closetmaid    closetmaid 
4   ryobi   batteries kyobi 
5   ryobi  10' table saw ryobi 
6 trafficmaster   traffic mast5er 

Ora usano

import pandas as pd, regex 
df=pd.read_clipboard(sep='\s\s+') 

test=df 
test['(?b)(?:WORD){e<=2}']=df.apply(lambda x: regex.findall(r'(?b)(?:'+x['word']+'){e<=2}', x['sentence']),axis=1) 
test['(?b)(?:\wWORD\W){e<=2}']=df.apply(lambda x: regex.findall(r'(?b)(?:\w'+x['word']+'\W){e<=2}', x['sentence']),axis=1) 
test['(?V1)(?b)(?:\w&&WORD){e<=2}']=df.apply(lambda x: regex.findall(r'(?V1)(?b)(?:\w&&'+x['word']+'){e<=2}', x['sentence']),axis=1) 
test['(?V1)(?b)(?:WORD&&\W){e<=2}']=df.apply(lambda x: regex.findall(r'(?V1)(?b)(?:'+x['word']+'&&\W){e<=2}', x['sentence']),axis=1) 

Per caricare la tabella nel vostro ambiente.

+0

Sono questi modificatori linea '(? V1)', '(? B)' e che cosa significano? – sln

+0

Come si confronta una parola _fuzzy_ con una parola reale? Stai usando un dizionario di qualche tipo? Il modo più semplice è dividere gli spazi bianchi e utilizzare un albero ternario personalizzato per scrivere tutte le parole in un dizionario. Mentre attraversi l'albero, potresti consentire _N_ lettere fuori posto. Avresti bisogno di un codice di diramazione speciale. – sln

+0

@sln: sta parlando di questo modulo: https://pypi.python.org/pypi/regex –

risposta

2

fare '(?b)\m(?:WORD){e<=2}\M'