2010-10-03 15 views
6

Mi chiedevo come si si andava a sbrogliare le stringhe in inglese (o in altre lingue occidentali) se si rimuovevano gli spazi bianchi?Justadistraction: tokenizing inglese senza spazi vuoti. Murakami SheepMan

L'ispirazione per la domanda è il carattere Sheep Man nel romanzo di Murakami 'Dance Dance Dance'

Nel romanzo, la pecora L'uomo è tradotto come dicendo cose come:

"likewesaid, abbiamo' «Togliti di nuovo la spina», disse l'uomo delle pecore. "Ma non lo so ... da solo.

Quindi, alcuni segni di punteggiatura vengono mantenuti, ma non tutti. Basta per un umano da leggere, ma in qualche modo arbitrario.

Quale sarebbe la vostra strategia per la creazione di un parser per questo? Combinazioni comuni di lettere, conteggi delle sillabe, grammatiche condizionali, previsioni sull'anticipo/dietro, ecc.?

In particolare, in Python, come si strutturerebbe un flusso di traduzione (permissivo)? Non chiedendo una risposta completa, solo un po 'di più su come risolverebbe il problema.

Lo chiedo in modo frivolo, ma penso che sia una domanda che potrebbe avere delle risposte interessanti (nlp/crypto/frequenza/social). Grazie!

risposta

3

In realtà ho fatto qualcosa del genere per lavoro circa otto mesi fa. Ho appena usato un dizionario di parole inglesi in un hashtable (per O (1) tempi di ricerca). Vado lettera per lettera abbinando parole intere. Funziona bene, ma ci sono numerose ambiguità. (asshit può essere colpito all'asino o come merda). Per risolvere queste ambiguità sarebbe necessaria un'analisi grammaticale molto più sofisticata.

+0

Si potrebbe provare un albero radice per lettera per lettera le ricerche. Ti permetterebbe anche di capire facilmente se ci fossero più potenziali incontri. – Olson

+1

Oh, wow. Avevo pensato a qualcosa del genere (un albero con 26 bambini su ciascun nodo, era il mio pensiero), ma il mio capo ha detto che era un'idea ridicola. Devo smettere di ascoltarlo. > :( – JoshD

+0

+1 In realtà avevo pensato a qualcosa del genere un po 'di tempo fa, mi sono imbattuto negli stessi problemi: "salve" == "hithere" == "clicca qui". "Per ottenere" == " insieme "==" insieme ". – inspectorG4dget

2

Prima di tutto, penso che tu abbia bisogno di un dizionario di parole inglesi - potresti provare alcuni metodi che si basano esclusivamente su alcune analisi statistiche, ma penso che un dizionario abbia migliori possibilità di ottenere buoni risultati.

Una volta che hai parole, si hanno due possibili approcci:

puoi classificare le parole in categorie grammaticali e utilizzare una grammatica formale per analizzare le frasi - ovviamente, si dovrebbe a volte ottenere alcuna corrispondenza o più corrispondenze - Non ho familiarità con le tecniche che ti permettono di allentare le regole grammaticali in caso di mancata corrispondenza, ma sono sicuro che ce ne devono essere alcune.

D'altra parte, si potrebbe semplicemente prendere un grande corpus di testo inglese e calcolare le probabilità relative di alcune parole l'una accanto all'altra - ottenendo un elenco di coppie e triple di parole. Dal momento che quella struttura di dati sarebbe piuttosto grande, è possibile utilizzare categorie di parole (grammaticale e/o basate sul significato) per semplificarla. Quindi devi solo costruire un automa e scegliere le transizioni più probabili tra le parole.

Sono sicuro che ci sono molti altri possibili approcci. Puoi persino combinare i due che ho menzionato, costruendo una sorta di grammatica con il peso legato alle sue regole. È un campo ricco per sperimentare.

1

Questo è solo un codice veloce che ho scritto che penso che funzionerebbe abbastanza bene per estrarre le parole da un frammento come quello che hai dato ... Non è completamente pensato, ma penso che qualcosa di simile funzionerebbe se non è possibile trovare un tipo di pre-confezionati di soluzione

textstring = "likewesaid, we'lldowhatwecan. Trytoreconnectyou, towhatyouwant," said the Sheep Man. "Butwecan'tdoit-alone. Yougottaworktoo." 

indiv_characters = list(textstring) #splits string into individual characters 

teststring = '' 
sequential_indiv_word_list = [] 

for cur_char in indiv_characters: 
    teststring = teststring + cur_char 
    # do some action here to test the testsring against an English dictionary where you can API into it to get True/False if it exists as an entry 
    if in_english_dict == True: 
     sequential_indiv_word_list.append(teststring) 
     teststring = '' 

#at the end just assemble a sentence from the pieces of sequential_indiv_word_list by putting a space between each word 

ci sono alcuni più problemi ad essere lavorato fuori, come se non fosse mai restituisce una partita, questo sarebbe ovviamente non funziona come sarebbe mai eguagliare se Ho continuato ad aggiungere più caratteri, tuttavia dal momento che la tua stringa dimostrativa aveva degli spazi potresti riconoscerli e ricominciare automaticamente da ognuno di questi.

Inoltre è necessario tenere conto di punteggiatura, scrivere condizionali come

if cur_char == ',' or cur_char =='.': 
    #do action to start new "word" automatically 
Problemi correlati