Contagem de caracteres da linguagem X no arquivo de texto misto?

4

Tenho arquivos de texto em vários idiomas e gostaria de contar o número total de caracteres imprimíveis de um dos idiomas. Ajuda que as linguagens habitam diferentes faixas unicode.

Meu caso de uso específico envolve hebraico, grego polônico e inglês - mas imagino que uma solução para esse problema também possa ser generalizada para outros contextos.

Gostaria de contar apenas para os caracteres hebraicos - isto é, Unicode [\u0590-\u05ff] . Aqui está um breve arquivo de entrada de amostra (que, pela minha contagem manual, contém 62 caracteres hebraicos):

[ Ps117 ]‬
h1: ‫  הללו את יהוה כל גוים שבחוהו כל האמים ‬
r1: Praise the LORD, all nations! Extol him, all peoples!
g1: Αλληλουια. Αἰνεῖτε τὸν κύριον, πάντα τὰ ἔθνη, ἐπαινέσατε αὐτόν, πάντες οἱ λαοί,
b1: Alleluia. Praise the Lord all you nations: praise him all you peoples.

h2: ‫  כי גבר עלינו חסדו ואמת יהוה לעולם הללו יה ‬
r2: For great is his steadfast love toward us; and the faithfulness of the LORD endures for ever. Praise the LORD!
g2: ὅτι ἐκραταιώθη τὸ ἔλεος αὐτοῦ ἐφ' ἡμᾶς, καὶ ἡ ἀλήθεια τοῦ κυρίου μένει εἰς τὸν αἰῶνα.
b2: For his mercy has been abundant toward us: and the truth of the Lord endures for ever.

Estou no Ubuntu 16.04.2 LTS, se isso ajudar. Eu imagino perl seria uma opção provável aqui, ou algum script de shell ... mas eu não sei essas coisas, e é por isso que estou perguntando!

Para o curioso, as linhas na minha entrada são: h = hebraico; r = Versão Padrão Revisada; g = Septuaginta grega; b = tradução de Brenton da Septuaginta; em cada caso, seguido por um número de verso.

    
por Dɑvïd 20.06.2017 / 13:48

3 respostas

4

Existe potencialmente um problema em determinar o comprimento das cadeias de caracteres Unicode. Veja esta página dos documentos de desenvolvedor do Twitter para mais detalhes sobre Normalização

A contagem de caracteres dependerá da localidade que você configurou. Você pode executar locale para verificar se você tem um código de idioma UTF-8 configurado. Feito isso, o código de @ stephen-rauch deve funcionar.

Dependendo da biblioteca de regex usada, você também poderá usar scripts nomeados como \p{Hebrew} e \P{Greek} Aqui está um exemplo do uso de \P{Hebrew} para remover todos os caracteres não hebraicos: Link

Editado: Os resultados iniciais foram devidos a um locale mal configurado

    
por 20.06.2017 / 16:10
4

Estes parecem vir perto para mim (testado no Ubuntu 16.04)

$ perl -0777 -MEncode -ne 'print decode("UTF-8",$_) =~ tr/\x{0590}-\x{05ff}//,"\n"' input
62
$ perl -0777 -MEncode -ne 'print decode("UTF-8",$_) =~ tr/\p{Hebrew}//,"\n"' input
63

Não sei qual deve ser a resposta "certa".

    
por 20.06.2017 / 21:15
3

Usando o python, você pode fazer algo assim:

Código:

# coding: utf-8
import re
import codecs

#find_hebrew = re.compile(ur'[\u0590-\u05ff]+')  # python 2
find_hebrew = re.compile(r'[\u0590-\u05ff]+')   # python 3

count = 0
with codecs.open('text_file', 'rU', encoding='utf-8') as f:
    for line in f.readlines():
        for n in find_hebrew.findall(line):
            count += len(n)
print(count)

Resultado:

62
    
por 20.06.2017 / 17:47