2010-08-24 12 views
8

Sto cercando di rimuovere i caratteri diacritici da un pangram in polacco. Sto usando il codice dal blog di Michael Kaplan http://www.siao2.com/2007/05/14/2629747.aspx, tuttavia, senza successo.Rimozione di segni diacritici in polacco

Considerare il seguente pangram: "Pchnąć w tę łódź jeża lub ośm skrzyń fig.". Tutto funziona bene, ma per la lettera "ł", ho ancora "ł". Immagino che il problema è che "ł" è rappresentato come singolo carattere unicode e non c'è alcun NonSpacingMark successivo.

Avete qualche idea su come posso risolverlo (senza fare affidamento sulla mappatura personalizzata in qualche dizionario - sto cercando una sorta di conversione Unicode)?

risposta

3

L'approccio adottato nell'articolo è quello di rimuovere i caratteri di Mark, Nonspacing. Dal momento che come si indica correttamente "ł" non è composto da due caratteri (uno dei quali è Mark, Nonspacing) il comportamento che si vede è previsto.

Non credo che la struttura di Unicode consenta di eseguire una rimappatura completamente automatizzata (l'autore dell'articolo che si riferisce raggiunge la stessa conclusione).

Se si è interessati solo ai caratteri polacchi, almeno la mappatura è piccola e ben definita (vedere ad esempio il fondo di http://www.biega.com/special-char.html). Nel caso generale, non penso che esista una soluzione automatizzata per i caratteri che non sono composti da un carattere standard più un carattere Mark, Nonspacing.

2

È nel Unicode chart, punto di codice \ u0142. Scorri verso il basso fino alla descrizione "Latino minuscolo con tratto", non ha scomposizione elencata. Non so nulla del polacco, ma è normale che una lettera abbia un segno distintivo che ne fa la propria lettera anziché una base con un segno diacritico.

1

Ci sono alcuni caratteri precomposti che non hanno scomposizioni significative.

(Ci sono anche una manciata che potrebbe avere scomposizioni ragionevoli che sono proibite da tale decomposizione nella maggior parte delle forme di normalizzazione, in quanto porterebbe a differenze tra la versione, che non renderebbe loro più la normalizzazione).

ł è uno di questi. IIRC non è inoltre possibile dare una trascrizione in base alla cultura ad alfabeti che non usano ł. Penso che i tedeschi tendano a trascriverlo a w piuttosto che a l (o forse è qualcun altro che lo fa), il che ha senso (non è del tutto giusto, ma è più vicino di l).

2

Dovrete sostituire questi manualmente (proprio come con ÆÐØÞßæðøþ in Latin-1).

Altre persone hanno avuto lo stesso problema, quindi il repository dati locale comune Unicode ha "È stato necessario aggiungere un traslitteratore che rimuove gli accenti, anche per gli accenti sovrapposti". (Ticket #2884)

2

Ecco la mia rapida implementazione della lista di stop polacca con la normalizzazione dei segni diacritici polacchi.

class StopList 
{ 
    private HashSet<String> set = new HashSet<String>(); 

    public void add(String word) 
    { 
     word = word.trim().toLowerCase(); 
     word = normalize(word); 
     set.add(word); 

    } 

    public boolean contains(final String string) 
    { 
     return set.contains(string) || set.contains(normalize(string)); 
    } 

    private char normalizeChar(final char c) 
    { 
     switch (c) 
     { 
      case 'ą': 
       return 'a'; 
      case 'ć': 
       return 'c'; 
      case 'ę': 
       return 'e'; 
      case 'ł': 
       return 'l'; 
      case 'ń': 
       return 'n'; 
      case 'ó': 
       return 'o'; 
      case 'ś': 
       return 's'; 
      case 'ż': 
      case 'ź': 
       return 'z'; 
     } 
     return c; 
    } 

    private String normalize(final String word) 
    { 
     if (word == null || "".equals(word)) 
     { 
      return word; 
     } 
     char[] charArray = word.toCharArray(); 
     char[] normalizedArray = new char[charArray.length]; 
     for (int i = 0; i < normalizedArray.length; i++) 
     { 
      normalizedArray[i] = normalizeChar(charArray[i]); 
     } 
     return new String(normalizedArray); 
    } 
} 

Non sono riuscito a trovare alcuna altra soluzione in rete. Così forse sarà utile per qualcuno

+0

Expect del 'L' tutti questi personaggi hanno solo [diacritici] (http: //en.wikipedia.org/wiki/Diacritic) (Vedo almeno ogonek, acute e dot) e potrebbe essere facilmente normalizzato usando 'Normalize'. Suggerirei di combinare i due metodi. – BalusC

+0

Normalizza è una libreria .NET? Scusa ... questo è snippet dal mio codice Java :) E scrivendo "Net" stavo pensando a InterNet, non a ".NET". –

2

Qualche tempo fa ho incontrato questa soluzione, che sembra funzionare bene (?):

public static string RemoveDiacritics(this string s) 
    { 
     string asciiEquivalents = Encoding.ASCII.GetString(
        Encoding.GetEncoding("Cyrillic").GetBytes(s) 
       ); 

     return asciiEquivalents; 
    } 
+0

È grandioso come un fascino – lag

Problemi correlati