혼합 텍스트 파일의 언어 X 문자 수는 무엇입니까?

혼합 텍스트 파일의 언어 X 문자 수는 무엇입니까?

혼합 언어 텍스트 파일이 있고 해당 언어 중 하나로 인쇄 가능한 문자의 총 개수를 간단히 계산하고 싶습니다. 언어가 다른 유니코드 범위에 있으면 도움이 됩니다.

나의 구체적인 사용 사례에는 히브리어, 다성 그리스어 및 영어가 포함되어 있지만 이 문제에 대한 해결책은 다른 상황에서도 일반화될 수 있다고 생각합니다.

저는 히브리어 문자(예: Unicode )만 계산하고 싶습니다 [\u0590-\u05ff]. 다음은 짧은 예제 입력 파일입니다(직접 계산한 결과 62개의 히브리어 문자 포함).

[ 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.

도움이 된다면 Ubuntu 16.04.2 LTS를 사용하고 있습니다. Perl이 가능한 옵션일 수도 있고 일부 쉘 스크립트일 수도 있을 것 같습니다. 하지만 저는 이런 것들에 대해 모르기 때문에 물어봅니다!


호기심에서 내가 입력한 줄은 다음과 같습니다: h= 히브리어; r= 개정 표준역; = g칠십인역 b; 각 경우에 절 번호가 붙습니다.

답변1

유니코드 문자열의 길이를 결정하는 데 문제가 있을 수 있습니다. 바라보다이 페이지정규화에 대한 자세한 내용은 Twitter 개발자 문서를 참조하세요.

문자 수는 구성하는 로케일에 따라 달라집니다. locale다음을 실행하여 UTF-8 로캘이 구성되었는지 확인할 수 있습니다 . 이 작업을 완료하면 @stephen-rauch의 코드가 작동합니다.

사용하는 정규식 라이브러리에 따라 명명된 스크립트를 사용할 수도 있습니다. 예를 들어 \p{Hebrew}다음은 히브리어가 아닌 모든 문자를 제거하는 예입니다 \P{Greek} .\P{Hebrew}협회

편집: 초기 결과는 잘못 구성된 로케일로 인해 발생했습니다.

답변2

이것들은 나에게 가까운 것 같습니다 (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

"올바른" 대답이 무엇인지 잘 모르겠습니다.

답변3

Python을 사용하면 다음과 같은 작업을 수행할 수 있습니다.

암호:

# 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)

결과:

62

관련 정보