Class: VivlioStarter::PDF::MecabNewlineCleaner
- Inherits:
-
Object
- Object
- VivlioStarter::PDF::MecabNewlineCleaner
- Defined in:
- lib/vivlio_starter/cli/pdf/mecab_newline_cleaner.rb
Overview
MeCab を利用して PDF から抽出したテキストの不要改行を除去するクリーナー
PDF からのテキスト抽出は組版上の行末で機械的に改行が入るため、 そのままでは文の途中で切れた読みにくいテキストになる。 改行を「残す(段落・見出し・箇条書きの区切り)」か「除去する(行送りに よる折り返し)」かを判定する必要があるが、日本語は英語と違い行末に ハイフン等の手掛かりがないため、表層的な正規表現の判定に加えて MeCab の形態素解析で行末・行頭の品詞を調べ、文が継続しているか (行末が格助詞・活用途中の動詞、行頭が助詞など)を判断する。
Defined Under Namespace
Classes: Token
Constant Summary collapse
- CONNECTIVE_PREFIXES =
行頭にあれば前行から文が継続しているとみなす接続表現
%w[が て と ので のに けど けれど けれども ものの し すると そして しかし でも].freeze
- LIST_MARKER_REGEX =
/\A(?:[-*・]|\d+\.)/- HEADING_REGEX =
/\A#+/- SECTION_HEADING_PREFIX_REGEX =
/\A(?:第[一二三四五六七八九十百千0-9]+章|[♣♠♥♦]?\s*\d+(?:-\d+)*(?:\.)?)\z/- SECTION_HEADING_REGEX =
/\A(?:第[一二三四五六七八九十百千0-9]+章\s*.+|[♣♠♥♦]?\s*\d+(?:-\d+)*(?:\.)?\s*.+)\z/- CHAPTER_HEADING_ONLY_REGEX =
/\A第[一二三四五六七八九十百千0-9]+章\z/- PUNCTUATION_REGEX =
/[。.!?!?…]+[))]】」』》]*\z/- SMALL_KANA_START_REGEX =
/\A[ゃゅょぁぃぅぇぉゎっァィゥェォヵヶッャュョヮ]/- MIDWORD_END_REGEX =
/[A-Za-z0-9a-zA-Z0-9ァ-ヶぁ-ゖ一-龯ー々〆ヵヶ]\z/- MIDWORD_START_REGEX =
/\A[A-Za-z0-9a-zA-Z0-9ァ-ヶぁ-ゖ一-龯ー々〆ヵヶ]/- ENDING_AUXILIARIES =
%w[です ます だ だった でした でしょう だろう である ません でしたら].freeze
- ENDING_PARTICLES =
%w[ね よ よね ぞ さ わ かな かしら].freeze
Instance Method Summary collapse
-
#clean(text) ⇒ Object
抽出テキスト全体を整形して返すエントリポイント.
-
#initialize(config = nil) ⇒ MecabNewlineCleaner
constructor
A new instance of MecabNewlineCleaner.
Constructor Details
#initialize(config = nil) ⇒ MecabNewlineCleaner
Returns a new instance of MecabNewlineCleaner.
35 36 37 38 39 |
# File 'lib/vivlio_starter/cli/pdf/mecab_newline_cleaner.rb', line 35 def initialize(config = nil) cfg = config || {} @mecab_command = cfg[:mecab_command] || 'mecab' @mecab_cache = {} end |
Instance Method Details
#clean(text) ⇒ Object
抽出テキスト全体を整形して返すエントリポイント
空行(2連続以上の改行)で区切った「段落」と「ギャップ」を交互に処理する。 段落内の改行は clean_paragraph で判定し、段落間のギャップも 「実は文の途中(ページ跨ぎ等)」であれば結合する。
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
# File 'lib/vivlio_starter/cli/pdf/mecab_newline_cleaner.rb', line 46 def clean(text) str = normalize_pdf_extracted_text(text) return str if str.empty? segments = str.split(/(\n{2,})/, -1) rebuilt = [] segments.each_with_index do |segment, idx| if idx.even? rebuilt << clean_paragraph(segment) else prev_block = rebuilt.last next_block = segments[idx + 1] if chapter_heading_gap?(prev_block, next_block) rebuilt << "\n" elsif chapter_title_gap?(rebuilt, prev_block, next_block) rebuilt << "\n" elsif should_merge_gap?(prev_block, next_block) # ギャップを完全に削除(結合) else rebuilt << segment end end end rebuilt.join end |