質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

3126閲覧

文字化けした文字を削除したい

momochi

総合スコア68

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2019/02/02 15:55

編集2019/02/03 09:17

書籍をOCR付きpdfでスキャンし,AdobeAcrobatReaderDCのテキスト保存でtxt化しました.
日本語の説明部分だけが欲しかったのですが,表や図,コード部分も読み取られており,文字化けしたようになっています.

なので,文字化け箇所を消す,もしくは日本語部分を取り出す,ということをしたいのですが,どのようにしたらよいか思いつきません.

アドバイスよろしくお願いいたします.

よく使う言語はPythonですが,他の言語でもかもいません!

スキャンしたもの

txtファイル

11 ~2整数浮動小数点数、文字列型’ 7 2最悪でもPythonがエラーメッセージを表示するだけです。プロのソフトウェア開発者 3であっても、コードを書いているときは、しょっちゅうエラーメッセージを見ているも 4のです。 51.2整数、浮動小数点数、文字列型 6式とは、値と演算子が組み合わさったもので、必ずひとつの値に評価されるものでし 7た。値のカテゴリーをデータ型といい、すべての値はいずれかひとつのデータ型に属し 8ています。Pythonの主なデータ型を表1-2に示します。例えば、-2\30の値は、整数 9(int)型の値です。整数型は、整数値を表すデータ型です。「イント」と読みます。一方、 103.14のような小数点を含む数値は、浮動小数点数(float)型です。「フロート」と読み 11ますo42という値は整数型ですが、42.0は浮動小数点数型になることに注意してくだ 12さい。 13表1-2主なデータ型 142,3,4, 5 15§“‘鼠α0,域率蕊郷誌 16aaaI 、!Hello! 1 , 111cats! 17整数(int) 18浮動小数点 19文字列(str 207仲筏脾理悪. 21イユ無“患擁り 22り革一十畢戯I 23(M叩)墨『坐串へ.〔) 24勺”姉““か「口 25剖I士f十F司一1 26Ff貼『唖で』q 27句l 28フ』イ士a 29一造I 30I 数織oat) ~ 1 31PythOnのプログラムは、文字列(str)型というテキストの値を持つこともできます 32(ストリング、ステア、スI、ルなどと読みます)。文字列は、Pythonが始まりと終わりを 33認識するように、シングルクォート( ' )やダブルクォート(11)で1並'んで記述します(例 34えば、'HeUo! JP' 'さらば残酷な世界よ! ・と書きます)。1文字も使わない文字列を 35使うこともできますO I 1や”・と書き、空文字列といいます。文字列については、4章 36で詳しく説明します。 37「SyntaxError:EOLwhilescanningstringliteral(文字列リテラルを走査中にEOL 38(文の末尾)に到達した)」というエラーメッセージが表示されたなら、おそらく文字列 39のクォートの閉じ忘れが原因です。例を示します。 40>>> 'HeUowor1d1 41Sv~ntaxE「「o「: EOLwhilescanningstrin91tteral

追記

テキストを取り出したい理由は,合成音声に読ませて,学習の助けになるかなぁ,と思ったからです.
本も見ながら音声を聞くので,精度は粗くても良いです.

個人的に思いついたアプローチは,
「各行について,ひらがなが5文字以下なら削除」です.

さい。

みたいな部分は削除されても構いません.

このアプローチで問題がありそうならコメントください.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

「文字化け」は「言語として異常」という事を意図されているので、じゃぁどうすればその異常を機械的に判別できるようになるのかという話に帰結すると思います。以下は一例、私が思いついた一つのアプローチです。

方針

Google Text-to-Speech(gTTSライブラリ)を利用してテキストを音声に変換、その音声の長さと元の文字列の長さを行単位で比較する。

code

やってみたデータ

列番号文字列の長さ音声の長さ一文字あたりの音声の長さ最初の16文字
0219.3360.4451 ~2整数浮動小数点数、文字列
14111.8320.289最悪でもPythonがエラーメッ
2399.8640.253であっても、コードを書いていると
341.3440.336のです。
4177.8960.4641.2整数、浮動小数点数、文字列
53812.6960.334式とは、値と演算子が組み合わさっ
63912.4560.319た。値のカテゴリーをデータ型とい
74216.8720.402ています。Pythonの主なデー
84315.840.368(int)型の値です。整数型は、
94416.6560.3793.14のような小数点を含む数値
104116.3920.400ますo42という値は整数型ですが
1130.960.320さい。
12104.80.480表1-2主なデータ型
1393.3360.3712,3,4, 5
14126.1440.512§“‘鼠α0,域率蕊郷誌
15277.4160.275aaaI 、!Hello! 1
1682.8080.351整数(int)
1752.760.552浮動小数点
1883.6240.453文字列(str
1983.7920.4747仲筏脾理悪.
2072.7840.398イユ無“患擁り
2183.4560.432り革一十畢戯I
22135.3760.414(M叩)墨『坐串へ.〔)
2383.5520.444勺”姉““か「口
24104.9920.499剖I士f十F司一1
2593.6480.405Ff貼『唖で』q
2631.20.400句l
2762.1840.364フ』イ士a
2841.680.420一造I
29135.2320.402I 数織oat) ~ 1
304213.1760.314PythOnのプログラムは、文字
314413.0320.296(ストリング、ステア、スI、ルな
324615.5760.339認識するように、シングルクォート
334617.4480.379えば、'HeUo! JP' 'さ
344214.1840.338使うこともできますO I 1や”
35103.8880.389で詳しく説明します。
365913.6320.231「SyntaxError:EOL
374011.880.297(文の末尾)に到達した)」という
38237.7520.337のクォートの閉じ忘れが原因です。
391611.5920.725>>> 'HeUowor1d1
404312.00.279Sv~ntaxE「「o「: EO

結論

やる前は上手くいくかもなぁと思ってましたが、やってみたら全然有意な結果が得られないアプローチだと判明したと思います。行単位ではなく文単位とかでやれば違う結果が得られるかもしれませんが、それだと言語解析の正攻法アプローチのほうが良さそうだなぁと思ったり。

投稿2019/02/03 06:12

編集2019/02/03 06:13
YouheiSakurai

総合スコア6142

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

firedfly

2019/02/03 08:39

面白いアプローチ! ただ音声の長さだけだと辛いですね。 やっぱり形態素解析して、その行に含まれる(辞書に載ってる)単語を数えるとかですか。
momochi

2019/02/03 08:51

言語解析とは日本語の文章になっているかの判定でしょうか. この本は600ページほどあるのですが,どれ位時間がかかるものですか. パソコンのスペックにもよるとおもいますが ,感覚的で構いません.
YouheiSakurai

2019/02/03 10:22

firedflyさん、ですね。形態素解析で後処理 or OCR前に対象領域外の削除、が正攻法でしょうね。 momochiさん、残念ながら私には形態素解析に関する知見がないのでなんとも言えないです。
guest

0

追記の方法を実装しました.
ベストアンサーは追記の手法を思いつくのに助けになった,firedflyさんを選ばせていただきました.

cleanOCR.py

1 2def countHiragana(sentence): 3 boolArray = [char for char in sentence if "あ" <= char <= "ん"] 4 return len(boolArray) 5 6 7output = [] 8with open("input.txt") as f: 9 while True: 10 line = f.readline() 11 # print(line) 12 if not line: 13 break 14 c = countHiragana(line) 15 if c >= 5: 16 output.append(line) 17 18print(output) 19 20with open("output.txt", "w") as f: 21 f.writelines(output) 22

input.txt

11 ~2整数浮動小数点数、文字列型’ 7 2最悪でもPythonがエラーメッセージを表示するだけです。プロのソフトウェア開発者 3であっても、コードを書いているときは、しょっちゅうエラーメッセージを見ているも 4のです。 51.2整数、浮動小数点数、文字列型 6式とは、値と演算子が組み合わさったもので、必ずひとつの値に評価されるものでし 7た。値のカテゴリーをデータ型といい、すべての値はいずれかひとつのデータ型に属し 8ています。Pythonの主なデータ型を表1-2に示します。例えば、-2\30の値は、整数 9(int)型の値です。整数型は、整数値を表すデータ型です。「イント」と読みます。一方、 103.14のような小数点を含む数値は、浮動小数点数(float)型です。「フロート」と読み 11ますo42という値は整数型ですが、42.0は浮動小数点数型になることに注意してくだ 12さい。 13表1-2主なデータ型 142,3,4, 5 15§“‘鼠α0,域率蕊郷誌 16aaaI 、!Hello! 1 , 111cats! 17整数(int) 18浮動小数点 19文字列(str 207仲筏脾理悪. 21イユ無“患擁り 22り革一十畢戯I 23(M叩)墨『坐串へ.〔) 24勺”姉““か「口 25剖I士f十F司一1 26Ff貼『唖で』q 27句l 28フ』イ士a 29一造I 30I 数織oat) ~ 1 31PythOnのプログラムは、文字列(str)型というテキストの値を持つこともできます 32(ストリング、ステア、スI、ルなどと読みます)。文字列は、Pythonが始まりと終わりを 33認識するように、シングルクォート( ' )やダブルクォート(11)で1並'んで記述します(例 34えば、'HeUo! JP' 'さらば残酷な世界よ! ・と書きます)。1文字も使わない文字列を 35使うこともできますO I 1や”・と書き、空文字列といいます。文字列については、4章 36で詳しく説明します。 37「SyntaxError:EOLwhilescanningstringliteral(文字列リテラルを走査中にEOL 38(文の末尾)に到達した)」というエラーメッセージが表示されたなら、おそらく文字列 39のクォートの閉じ忘れが原因です。例を示します。 40>>> 'HeUowor1d1 41Sv~ntaxE「「o「: EOLwhilescanningstrin91tteral 42

output.txt

1最悪でもPythonがエラーメッセージを表示するだけです。プロのソフトウェア開発者 2であっても、コードを書いているときは、しょっちゅうエラーメッセージを見ているも 3式とは、値と演算子が組み合わさったもので、必ずひとつの値に評価されるものでし 4た。値のカテゴリーをデータ型といい、すべての値はいずれかひとつのデータ型に属し 5ています。Pythonの主なデータ型を表1-2に示します。例えば、-2\30の値は、整数 6(int)型の値です。整数型は、整数値を表すデータ型です。「イント」と読みます。一方、 73.14のような小数点を含む数値は、浮動小数点数(float)型です。「フロート」と読み 8ますo42という値は整数型ですが、42.0は浮動小数点数型になることに注意してくだ 9PythOnのプログラムは、文字列(str)型というテキストの値を持つこともできます 10(ストリング、ステア、スI、ルなどと読みます)。文字列は、Pythonが始まりと終わりを 11認識するように、シングルクォート( ' )やダブルクォート(11)で1並'んで記述します(例 12えば、'HeUo! JP' 'さらば残酷な世界よ! ・と書きます)。1文字も使わない文字列を 13使うこともできますO I 1や”・と書き、空文字列といいます。文字列については、4章 14で詳しく説明します。 15(文の末尾)に到達した)」というエラーメッセージが表示されたなら、おそらく文字列 16のクォートの閉じ忘れが原因です。例を示します。 17

投稿2019/02/03 09:55

momochi

総合スコア68

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

こんにちは。

まず「文字化けしている」かどうかの判定は非常に難しいです。

日本語部分だけを取り出すのは
句読点が含まれている行を取り出せばほぼ行けそうですが、
例外もあるはずなので工夫がいるでしょう。
(日本語に挟まれた行は1行まで日本語とみなす、など。)

文字化けしているの箇所を取り出すのは、
それが表や図だけで、かつその部分の1行の文字数は少ないと言えるなら
表1-2などを起点にして、1行が15文字以内の連続する行を削除」
というコードでどうにかなるかも知れません。

投稿2019/02/02 19:03

firedfly

総合スコア1131

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

momochi

2019/02/03 08:28

表や図のキャプションを起点とする考えは役に立ちそうです. ありがとうございます! 時間に余裕ができたら実装してみます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問