In un certo senso, entrambe le risposte fornite da Mukesh Kumar e GsusRecovery sono di aiuto, ma non completamente corrette.
document.replaceAll("[^\\u0009\\u000a\\u000d\\u0020-\\uD7FF\\uE000-\\uFFFD]", "");
sembra sostituire tutti i caratteri non validi. Ma CoreNLP sembra non supportare ancora di più. Li ho capito manualmente eseguendo il parser su tutto il mio corpo, che ha portato a questo:
document.replaceAll("[\\uD83D\\uFFFD\\uFE0F\\u203C\\u3010\\u3011\\u300A\\u166D\\u200C\\u202A\\u202C\\u2049\\u20E3\\u300B\\u300C\\u3030\\u065F\\u0099\\u0F3A\\u0F3B\\uF610\\uFFFC]", "");
Così adesso sto facendo funzionare due comandi replaceAll()
prima di consegnare il documento al parser. Il frammento di codice completo è
// remove invalid unicode characters
String tmpDoc1 = document.replaceAll("[^\\u0009\\u000a\\u000d\\u0020-\\uD7FF\\uE000-\\uFFFD]", "");
// remove other unicode characters coreNLP can't handle
String tmpDoc2 = tmpDoc1.replaceAll("[\\uD83D\\uFFFD\\uFE0F\\u203C\\u3010\\u3011\\u300A\\u166D\\u200C\\u202A\\u202C\\u2049\\u20E3\\u300B\\u300C\\u3030\\u065F\\u0099\\u0F3A\\u0F3B\\uF610\\uFFFC]", "");
DocumentPreprocessor tokenizer = new DocumentPreprocessor(new StringReader(tmpDoc2));
for (List<HasWord> sentence : tokenizer) {
List<TaggedWord> tagged = tagger.tagSentence(sentence);
GrammaticalStructure gs = parser.predict(tagged);
System.err.println(gs);
}
Questo non è necessariamente un elenco completo dei caratteri non supportati, però, che è il motivo per cui ho aperto un issue su GitHub.
Si prega di notare che CoreNLP rimuove automaticamente quei caratteri non supportati. L'unica ragione per cui desidero eseguire il preprocesso del mio corpus è di evitare tutti quei messaggi di errore.
UPDATE novembre 27ths
Christopher Manning appena risposto alla GitHub Issue ho aperto. Esistono diversi modi per gestire questi caratteri utilizzando la classe edu.stanford.nlp.process.TokenizerFactory;
. Prendete questo esempio di codice per tokenize un documento:
DocumentPreprocessor tokenizer = new DocumentPreprocessor(new StringReader(document));
TokenizerFactory<? extends HasWord> factory=null;
factory=PTBTokenizer.factory();
factory.setOptions("untokenizable=noneDelete");
tokenizer.setTokenizerFactory(factory);
for (List<HasWord> sentence : tokenizer) {
// do something with the sentence
}
È possibile sostituire noneDelete
in linea 4 con altre opzioni. Sto citando Manning:
"(...) l'insieme completo di sei opzioni che combinano se registrare un avviso per nessuno, il primo, o tutto, e se eliminarli o includerli come carattere singolo token nell'output: noneElimina, firstDelete, allDelete, noneKeep, firstKeep, allKeep. "
Ciò significa che per mantenere i caratteri senza ottenere tutti quei messaggi di errore, il modo migliore è utilizzare l'opzione noneKeep
. In questo modo è molto più elegante di qualsiasi tentativo di rimuovere quei personaggi.
Il metodo 'replaceAll' crea un nuovo' String'; non modifica 'document'. Hai fatto 'document = document.replaceAll (...)' (o qualcos'altro per catturare il valore restituito)? –
L'ho usato nell'istanza della classe '' DocumentProcessor'' in questa riga: '' DocumentPreprocessor tokenizer = new DocumentPreprocessor (new StringReader (document.replaceAll ("\\ p {C}", ""))); ' '. –