2012-03-12 12 views
11

Ho 30.000 articoli in francese in un file JSON. Vorrei eseguire alcune analisi del testo su entrambi i singoli articoli e sul set nel suo complesso. Prima di andare oltre, sto iniziando con semplici obiettivi:Come posso taggare e tagliare il testo francese usando NLTK e Python?

  • identificare le entità importanti (persone, luoghi, concetti)
  • Trova cambiamenti significativi nel importanza (~ = frequenza) di quelle entità nel corso del tempo (usando il numero di sequenza articolo come un proxy per volta)

i passi che ho preso finora:

  1. importati i dati in una lista python:

    import json 
    json_articles=open('articlefile.json') 
    articlelist = json.load(json_articles) 
    
  2. selezionato un singolo articolo per verificare, e concatenate il corpo del testo in una singola stringa:

    txt = ' '.join(data[10000]['body']) 
    
  3. Loaded una frase tokenizzatore francese e dividere la stringa in una lista di frasi:

    nltk.data.load('tokenizers/punkt/french.pickle') 
    tokens = [french_tokenizer.tokenize(s) for s in sentences] 
    
  4. Ha tentato di dividere le frasi in parole usando il WhiteSpaceTokenizer:

    from nltk.tokenize import WhitespaceTokenizer 
    wst = WhitespaceTokenizer() 
    tokens = [wst.tokenize(s) for s in sentences] 
    

Questo è dove mi sono bloccato, per i seguenti motivi:

  • NLTK non dispone di un tokenizzatore built-in che può dividere francese in parole. Lo spazio bianco non funziona bene, in particolare perché non si separa correttamente sugli apostrofi.
  • Anche se dovessi usare le espressioni regolari per dividere in singole parole, non c'è PoS francesi (parti del discorso) tagger che posso usare per contrassegnare quelle parole, e non c'è modo per loro pezzo in unità logiche di senso

per l'inglese, ho potuto contrassegnare e pezzo il testo in questo modo:

tagged = [nltk.pos_tag(token) for token in tokens] 
    chunks = nltk.batch_ne_chunk(tagged) 

miei principali opzioni (in ordine di preferenza corrente) sembrano essere:

  1. Usa nltk-trainer per addestrare i miei tagger e chunker.
  2. Utilizzare il wrapper python per TreeTagger solo per questa parte, poiché TreeTagger è già in grado di taggare il francese e qualcuno ha scritto un wrapper che chiama il file binario TreeTagger e analizza i risultati.
  3. Utilizzare uno strumento diverso.

Se dovessi fare (1), immagino che avrei bisogno di creare il mio corpus etichettato. È corretto o sarebbe possibile (e premesso) utilizzare la Treebank francese?

Se il formato corpuscolo francese Treebank (example here) non è adatto per l'uso con nltk-trainer, è possibile convertirlo in tale formato?

Quali approcci hanno gli utenti di lingua francese NLTK portati al tag PoS e al testo del blocco?

risposta

4

Ecco alcuni suggerimenti:

  1. WhitespaceTokenizer sta facendo quello che ha significato per. Se vuoi dividere gli apostrofi, prova con WordPunctTokenizer, controlla gli altri tokenizer disponibili o fai il rollover con il tokenizer di Regexp o direttamente con il modulo re.

  2. Assicurati di aver risolto i problemi di codifica del testo (unicode o latin1), altrimenti la tokenizzazione andrà ancora male.

  3. Il nltk viene fornito solo con il tagger inglese, come hai scoperto. Sembra che usare TreeTagger sia il minimo lavoro, dato che è (quasi) pronto per l'uso.

  4. Allenarsi da soli è anche un'opzione pratica. Ma sicuramente non dovresti creare il tuo corpus di allenamento! Usa un corpus di tag francesi già esistente. Otterrai i migliori risultati se il genere del testo di allenamento corrisponde al tuo dominio (articoli). Inoltre, è possibile utilizzare nltk-trainer ma è anche possibile utilizzare direttamente le funzionalità NLTK.

  5. È possibile utilizzare il corpus Treebank francese per la formazione, ma non so se c'è un lettore che conosce il suo formato esatto. In caso contrario, è necessario iniziare con XMLCorpusReader e creare una sottoclasse per fornire un metodo tagged_sents().

  6. Se non si è già nella mailing list degli utenti di nltk, penso che vorrai andare avanti.

+1

+1 WordPunctTokenizer. Se c'è una Treebank francese, allora è probabilmente una grande risorsa per addestrare un tagger pos. E se è necessario creare un lettore di corpus personalizzato, sono sicuro che NLTK sarebbe felice di includerlo. Una volta fatto ciò, nltk-trainer supporta la specifica di un lettore di corpus personalizzato. – Jacob

+0

Grazie Alexis e Jacob. Non so di un corpus di francese con tag esistente, quindi probabilmente proverò prima TreeTagger. Come dici tu, probabilmente è più facile che scrivere un corpus reader personalizzato per leggere French Treebank. Grazie per il suggerimento ri: la mailing list di nltk-users. Ho letto alcuni post precedenti sull'archivio web, ma avevo dimenticato di iscrivermi. – Rahim

5

A partire dalla versione 3.1.0 (gennaio 2012), lo Stanford PoS tagger supporta il francese.

Dovrebbe essere possibile utilizzare questa tagger francese in NLTK, utilizzando di Nitin Madnani Interface to the Stanford POS-tagger

non ho ancora provato questo, ma suona più facile rispetto agli altri approcci ho considerato, e dovrei essere in grado per controllare l'intera pipeline da uno script Python. Commenterò questo post quando avrò un risultato da condividere.

+0

Il tagger Stanford PoS è pieno di html grezzo in francese e mescola con parole inglesi. Io non consiglio la soluzione – c24b

+0

Il tagger Stanford PoS non sembra essere il miglior modo in termini di prestazioni. Mixare Python con una JVM non è davvero un modo pititico per procedere. – toshiro92

5

C'è anche TreeTagger (che supporta il corpus francese) con un wrapper Python. Questa è la soluzione che sto attualmente usando e funziona abbastanza bene.

Problemi correlati