Skip to content

Instantly share code, notes, and snippets.

@kyu999
Last active August 29, 2015 14:05
Show Gist options
  • Save kyu999/5bb18b231494c3ded7cc to your computer and use it in GitHub Desktop.
Save kyu999/5bb18b231494c3ded7cc to your computer and use it in GitHub Desktop.
改行ルールほぼ最終
separate編:
1. 助詞もしくは副詞の後は切る
2. 記号のあとは切る
3. 長いと切る
regulate編:
1. 左括弧の前で切れてたらくっつける
2. 記号の連続、助詞の連続の場合もくっつける
3. 右括弧以外の記号の前ではくっつける
@kyu999
Copy link
Author

kyu999 commented Aug 10, 2014

横浜の|隠れ家BAR『国産クラフトビール』|の|飲み比べイベント|開催 :長い。

TODO:

  1. 長い名詞の羅列は3分の2地点で切る
  2. クォーテーションは括弧同様にくっつける

@kyu999
Copy link
Author

kyu999 commented Aug 10, 2014

後はクォーテーションと長い名詞の羅列に対処したら終了

@kyu999
Copy link
Author

kyu999 commented Aug 10, 2014

-- coding:utf-8 --

import re
import unicodedata
import MeCab
import os

class SpeechTitleSplitter(object):
"""This class split a given title and produces split points for beatiful rendering of that by the simple way"""

def __init__(self):
    self.hiragana_pattern = re.compile(u'[ぁ-ん]+')
    self.kanji_pattern = re.compile(u'[一-龠]+')
    self.katakana_pattern = re.compile(u'[ァ-ヴ]+')
    self.alphanumeric_pattern = re.compile(u'[a-zA-Z0-9]+')
    self.kigou_pattern = re.compile(u'[!?:;/〜。、!\"#$%&\'*+,-./・:;<==>?]+')
    self.left_kakko_pattern = re.compile(u'([\[\{{[「『(⦅〈《〔〘【〖])')
    self.right_kakko_pattern = re.compile(u'[}]」』))⦆〉》〕〙】〗]+')

def is_kind_base(self, pattern, letters):
    """
    文字種かどうかを調べるための関数のベース関数。判定は1文字でも含まれてたらTrue, else False
    1文字ごとの判定にはこれを活用できる。
    """
    if pattern.match(letters):
        return True
    else:
        return False

def is_hiragana(self, letters):
    return self.is_kind_base(self.hiragana_pattern, letters)

def is_kanji(self, letters):
    return self.is_kind_base(self.kanji_pattern, letters)

def is_katakana(self, letters):
    return self.is_kind_base(self.katakana_pattern, letters)

def is_alphanumeric(self, letters):
    return self.is_kind_base(self.alphanumeric_pattern, letters)

def is_kigou(self, letters):
    return self.is_kind_base(self.kigou_pattern, letters)

def is_left_kakko(self, letters):
    return self.is_kind_base(self.left_kakko_pattern, letters)

def is_right_kakko(self, letters):
    return self.is_kind_base(self.right_kakko_pattern, letters)

def get_feature(self, node):
    """
    品詞等の情報をnodeから取り出してunicode化する
    """
    features = node.feature.split(",")
    unicoded_features = []

    for each_feature in features:
        unicoded_features.append(unicode(each_feature, "utf-8"))

    return unicoded_features    

def separate(self, sentence): 
    """
    品詞単位でiterateして分割
    """

    #MeCabは半角空白を認識しないので全角空白に置き換える
    encoded_sentence = sentence.replace(u" ", u" ").encode("utf-8")

    if len(encoded_sentence) <= 0:
        return None

    else:

        tagger = MeCab.Tagger("-O wakati")
        node = tagger.parseToNode(encoded_sentence)

        break_points = []            
        current_position = 0

        #現在つながっている長さ
        chunk_len = 0

        pre_node = node
        current_node = node.next

        while current_node:

            if not node.surface:
                node = node.next
                continue 

            else:
                breakable = False                    

                unicoded_surface = unicode(current_node.surface, "utf-8")
                current_position += len(unicoded_surface)

                this_len = len(unicoded_surface)
                chunk_len += this_len

                pre_feature = self.get_feature(pre_node) 
                current_feature = self.get_feature(current_node)

                #助詞もしくは副詞の後は切る
                if current_feature[0] == u"助詞" or current_feature[0] == u"副詞":
                    breakable = True  

                #記号の後は切る    
                elif current_feature[0] == u"記号":
                    breakable = True

                #長い名詞は切る
                elif chunk_len > 5 and pre_feature[0] == u"名詞" and current_feature[0] == u"名詞" and  not current_feature[1] == u"数":
                    breakable = True

                #whether break or not    
                if breakable:
                    break_points.append(current_position)
                    chunk_len = 0

                #update cursor    
                pre_node = current_node
                current_node = current_node.next

        return break_points

def regulate(self, breaks, sentence):
    """
    文字単位でiterateする。必要以上に区切られていたらその修正もする。
    """

    pre = sentence[0]
    now = ""

    for i, char in enumerate(sentence):

            now = sentence[i]

            #前の文字後にて区切られていたら
            if not i == 0 and i in breaks:

                #もし右括弧のまえでbreakしてたら取り除く
                if self.is_right_kakko(char):
                    breaks.remove(i)

                if self.is_kigou(char):
                    breaks.remove(i)

            #前の文字列後が区切られてないけど追加したい場合
            else:

                #もし左括弧系の前が区切られたなかったら区切る
                if self.is_left_kakko(char):
                    breaks.append(i)

            #今の文字後にて区切られていたら    
            if i + 1 in breaks:

                #もし左括弧系の後にbreakしてたら取り除く
                if self.is_left_kakko(char):
                    breaks.remove(i + 1)

            else:

                #もし右括弧系の後が区切られてなかったら区切る
                if self.is_right_kakko(char):
                    breaks.append(i + 1)

            #update
            pre = now

    return breaks

def get_break_points(self, sentence): 
    frequent_breaks = self.separate(sentence)
    return self.regulate(frequent_breaks, sentence)

def visualize(self, break_points, sentence):
    """
    タイトル分割の視覚化
    """
    formatted_sentence = []

    for i, char in enumerate(sentence):
        formatted_sentence.append(char)

        if i + 1 in break_points:
            formatted_sentence.append("|")

    return "".join(formatted_sentence)

def check_separate(self):

    f = open("sample_title.txt", "r")

    lines = f.readlines()

    for line in lines:
        unicoded_line = unicode(line, "utf-8")
        breaks = self.separate(unicoded_line)
        print("------------")
        print(self.visualize(breaks, unicoded_line))

    f.close()

def checking(self):

    f = open("sample_title.txt", "r")

    lines = f.readlines()

    for line in lines:
        unicoded_line = unicode(line, "utf-8")
        breaks = self.get_break_points(unicoded_line)
        print("------------")
        print(self.visualize(breaks, unicoded_line))

    f.close()

@kyu999
Copy link
Author

kyu999 commented Aug 10, 2014

球児無失点復帰|「|(感慨は)|まったく|ない」| :開き括弧の連続はくっつけたい

@kyu999
Copy link
Author

kyu999 commented Aug 10, 2014


あなたは|いくつ知ってる?スタバ|の|裏メニューまとめ|


雲南省地震 |被災地の|「泥水ラーメン」|報道に、|「ウソだ、|信じるな」|と|報じた環球網| |一転して|事実を|認め|「謝罪」=中国メディア| |(1/2)|


【Twitter】|焦げたホットケーキが|余りに|美しすぎると|話題


イオンに|異変?スーパー|不振で赤字寸前| |遅れる消費増税|対策、|首都圏連合に|暗雲か||ビジネスジャーナル/Business| |Journal |スマホ


水素で|動く燃料電池|車、|200万~300万円|補助へ|


「日本一綺麗」|15歳体操天才|少女デビュー| - スポーツ|ニュース : |nikkansports.com


トカゲなんて|序の口!|動物園の|ようなメニューが|並ぶ|「珍獣屋」|


ハーマイオニーより|可愛い外国人|を|見たことが|ない


阿部懲罰交代!|G投手陣の|小林“|支持率”|じわじわ|上昇中


加護亜依、|細すぎ!|ビキニで|太る宣言


全米で|話題沸騰の|効果絶大ダイエット|『ホール30ダイエット』|と|は?


似顔絵や|指輪の|写真公開 |段ボール女性|遺体


「合コンで| |“|1杯目”| |に|注文したら好印象な飲み物」|ベスト3を|発表しちゃうよ|ぉ~! 第1位|は|意外に|も|「とりあえず|ビール」|だって!!!|


ご当地アンテナショップ|の|有料試飲の|コストパフォーマンスが|異常!|


原幹恵の|ムチムチボディーwww|


ダイエット中|は|絶対避けて!|食べると|「お腹が|どんどん|太る」|フルーツ5つ


「マツコ&有吉」|人気の|裏に|2層構造”? 深夜に|テレビを|見ない層が|『怒り新党』|に|ハマる理由|(東洋経済オンライン)|


<野球部員落雷|死>現場の|高校、|全部活を|10日まで|中止|(毎日新聞)|


東京の|芸人の|多くは|「アンチ島田紳助」| |復帰できて|も|関西ローカル|番組のみ?


『HERO』|で|光ったキャバ嬢|役・|丸高愛実、|ハマリ役の|背景に|あった過去の|役柄


オリジナルカクテル|も|作れちゃう!?|「ファミレス|呑み」|の|進化が|止まらない!|


ケイト・|モスが|ジャスティン・ビーバーに|説教!|「礼儀を|わきまえなさい」|


乗用車が|歩道乗り上げ暴走=|女性軽傷、|運転手行方追う―|警視庁


第1子出産の|蛯原友里の|双子妹・|英里、|結婚10年目|で|出産を|決意した理由


学校や|職場で|チヤホヤされる女性に|共通する6つの|ポイント


水泳部男子、|強制わいせつ|罪


今年の|コミケが|ヤバい・・・|死人が|出るぞ|wwwwwwwwwwwwwww


先発の|本田が|先制アシスト|含む2点に|絡む...ミラン|が|チーバスに|快勝


哀川翔、|特異?な教育方針| |娘が|明かす|「家で|も|このままです」|


に|おってたらや|だな......女子|は|汗の|ニオイを|どう|防いでる?


男性に|聞いた!| |「一緒に|食事すると|まずくなる......二度|と|食事に|誘いたくない女性」|の|特徴5選


ユッキーナ、|ママ友問題について|語る


川口春奈ミニ|スカで|初体験始球式|


台風第11号| |南大東島の|東南東を|北北西へ|


小学1年生の|女の子の|顔を|ペロペロした犯人が|リアル亀仙人|wwwwwwwwwwwwwwwww|


これだから|やめられない!|学校や|職場恋人の|特権・|4つ


大島優子が|二輪免許取得| |さっそく|バイクに|乗って|ドライブ


この画像が|キモオタの|心理を|的確に|表現してる


ミタパン、|西武・|金子侑と|熱愛!|一度は|破局も|先月復活


マクドナルドと|消費者が|"共創ソース|"を|開発!| |代表ソースに|選ばれたのは!?


結婚したい!| |美熟女TOP|10


ナポリに|敗戦も|手ごたえを|感じるバルセロナの|ペドロと|ラキティッチ


日本史上、|一番ひどい悪人だと|思う1位|「明智光秀」|


全日空787―|9型機就航


納豆の|パキッ|と|たれ考えたやつwwwww|


新生VAIO|3モデルが|1万1016円|引きに| |購入済みの|人に|は|差額ぶんを|返金対応


視聴率23%|超 |かよ役の|黒木華が|明かす|「蓮子と|伝助、|おでこに|チュは|アドリブ」|


adidasから|心拍ゾーンを|視認できる“|超本気”|なウェアラブルが|登場


「これは|奴隷契約」|安室奈美恵 |超強気な独立騒動|の|裏


癒し系に|見える、|休日リラックス|モードの|眉メイク


激写!|江頭2:50、|高視聴率男の|意外な素顔 |真面目で|紳士、|ストイックで日々鍛錬...


東海大相模が|“|4本の|矢”|で|松本に|挑む - 高校野球|ニュース : |nikkansports.com


8月から|は|やり方変えて!!|星座別・|彼の|落とし方の|ツボ


ささいなことだけど、|自分の|中で|は|めっちゃ|イラっと|する許せないことは?


「かたじけない」|「ござる」|だけ|じゃ|ない!| |武士語4選


俺が|ヤクザに|気に入られて|ヤクザの|女で|童貞切った話


劇場版|『中二病で|も|恋が|したい!』|が|テレビ初放送!|


エボラ出血熱 |リベリアで|非常事態宣言|


O型彼氏と|O型彼女が|上手に|交際するコツ・|4つ


GACKT破局|を|後悔|「ボクは|まだまだ|ガキん|ちょ。|本当に|ありがとう。|伝われば|いいよ|な」|


ミタパン|「めざまし」|出演も|熱愛触れず、|淡々|と|スポーツ情報|紹介


ドラマ|「永遠の|0」|キャスト発表|第5弾は|工藤阿須加!!|


診察室で|医師切られ重傷=|男が|車で|逃走−|札幌


花束に|も|なります♪ リアル|すぎる|「フラワーカップケーキ」|


衝撃!|しょこたんがセミ|の|抜け殻まみれ|に!|


お店の|トイレにて|「従業員も|使用することが|あります」| |←|存分に|使えや


ハヤブサ|「兄キ!」| |ワシ|「お前、|うちの|一族じゃ|ないぞ」| |タカ|「お前は|今日から|インコ族だから」| |ハヤブサ|「 」|


未練タラタラ|は|嫌!|後腐れの|ない上手な別れ方・|4選


タイガーが|全米プロ出場|へ!|「痛みは|ない」|


佐村河内守が|新垣隆の|新曲|「交響曲HARIKOMI」|に|ダメ出し!|


バカ4人組が|線路に|進入wwwwwwww|


天皇杯 |札幌5発!|前橋に|圧勝 - 天皇杯|ニュース


明徳義塾“|馬淵節”|早くも|さく裂!|智弁・|岡本を|「敬遠しないと|は|言わん」|


10代2人、|高波に|さらわれ不明 |牧之原市


<ふるさと納税>税金軽減上限|2倍に| |15年度から|拡充検討


エボラ欧州上陸。|アフリカは|道に|遺体、|アメリカは|政府が|エボラ特許


出来高変化率|ランキング|(13時台)|~|ゼンショーHD|が|急落、|業績予想の|下方修正を|ネガティブ視|


東京都墨田区|の|東京スカイツリー|に|パティシエ5人|による|スイーツが|登場


救助ヘリ会社|の|容疑者自殺=|スイス


女子バドミントン|部を|譲渡


「安倍首相、|日韓関係改善|に|改めて|意欲示す」|


8月に|最も|増える肌トラブル|「ニキビ」|を|種類別に|ケアしよう!|


次々|と|生傷の|増える女性の|顔......|なぜ|こんなことに?


自信満々、|安倍総理が|決断!| |9月解散・|総選挙へ| |どこより|も|早い|「全300小選挙区」|当落完全調査| |電撃訪朝で|絶対に|勝つ|「あと4年、|オレが|やるんだ」| | 経済の|死角


夏の|必須アイテム|だけど......。会社|に|「サンダル」|で|出社するのは|アリ? ナシ?


なぜ|私は、|不満ながら|も|彼氏の|世話を|焼いて|しまうのか?


EXILE |TRIBE、|新曲PVで|歌舞伎町を|闊歩


世界初3Dプリント|で|作られたサックス、|さてその音色は?


原爆の|日 |黙祷ツイート|に|賛否両論


CLプレーオフ|出場チームが|決定、|スタンダールや|ゼニト進出...|セルティック|敗退


横浜の|隠れ家BAR|『国産クラフト|ビール』|の|飲み比べイベント開催|


MS、|IEに|古いActiveXコントロール|の|起動を|ブロックする仕組みを|導入


全国の|クラフトビール|各種1000円| |横浜の|「隠れ家」|バーで|飲み比べイベント


オービス通知|機能を|追加--iOS|向け地図ナビアプリ|「MapFan+」|が|バージョンアップ


レアル、|仏代表FWベンゼマ|と|2019年まで|の|契約延長を|発表


兵庫県議会、|政活費支出穴|だらけ |野々村氏以外|も|


落雷の|生徒死亡で|部活動休止 |落雷対策を|優先 |愛知


アフリカの|カカオ農家が|初めて|チョコレートを|食べた反応。|


新生Foursqure|アプリが|登場 |まず|大量の|“|好み”|登録で|カスタマイズ


VAIO社製|PC、|1万円値下げ|


かき氷の|上から|プレミア焼酎|「森伊蔵」|を|ぶっかける天文館|むじゃきの白熊|を|食べて|みた / 正直|焼酎は|なくて|いい


シリコンバレー101 |(577)| オンライン|ショッピング|の|大海に|Amazonクジラ|を|放つ|「Fire |Phone」|


1945年8月|7日、|広島へ|の|原爆投下を|世界は|どう|報じたか|


9月の|内閣改造 |最大の|サプライズは|小泉進次郎氏|の|入閣か|


この|「生パスタ」|は|一度|味わって|おきたい!|吉祥寺に|ある名店|「スパ吉」|


センチュリー、|お風呂に|浮かぶスピーカー - |7色LEDで|癒しの|バスタイムを|


黙って|いれば|カワイイ!? |ブスな話し方を|劇的に|変える“|マジックワード|”|と|は|


実感!|中国不動産バブル|は|すさまじい


電車と|ホームに|挟まれた男性、|乗客総出で|救出


山本美月、|瞳キラキラ|「輝き大使」|に|


TV未放送|『キルラキル』|第25話先行|上映が|決定!|


キリンチューハイ |ビターズ、|想定の|2倍以上の|売上を|記録


ハワイで|口コミNo.|1を|獲得したパンケーキは、|“|ぐるぐる|”|が|目印|エル・|オンライン


ソニーモバイル|純正aptX|対応首掛けBluetooth|ヘッドセット|が|国内発売開始|


土日限定!|マグノリアベーカリーで|ニューヨーカーな朝食が|食べられるように|なる!?


レスリング、|吉田と|伊調が|1位


今日の|エンジンの|ご機嫌は|いかが?―ヤマハ発動機|が|「バウリンガル」|エンジン版アプリ|


東電が|見せた′|′|再値上げ回避|′|′|へ|の|覚悟 |原発なし、|給与引き上げ|で|も|第1四半期は|経常黒字に|


IIJの|音声通話機能|付きSIM、|当日引き渡し|店舗が|拡大


カルビーまさかの味覇|味ポテチ、|人気中華調味|料と|初の|コラボ商品。| | Narinari.com


議事録――|会議後の|アクションが|読める|「章立て力」|


(インタビュー)|中国外交は|変わったのか| |ベイツ・ギルさん|


PSMの|ブレーメン戦|で|清武が|ゴール、|酒井宏は|フル出場


考古学博物館|の|倉庫に|6500年前|の|骸骨を|発見。|(ペンシルベニア|州)|


クリスピー・クリームから、|ハロウィンモチーフ|の|ドーナツが|4種類登場


ベーコンで|出来たベッド登場?美味しくて|香ばしい眠りを|あなたに|♡


“|冷やして|食べる”|季節限定ジュレ|で|パンを|もっと|美味しく!|アンデルセン|「ヒュッゲ」|


トヨタ、|足元は|過去最高益で|も|浮かれず


ピクセラ、|車内の|iPhone/|iPadが|テレビに|なるワイヤレスチューナー|を|発売


米Google、|Siriより|も|奥ゆかしいIMアプリ|「Emu」|を|買収


カトパン差し置き、|枡田アナが|センター奪取|に|興奮!?


原爆の|日 |黙祷ツイート|に|賛否両論


ヤフー検索の|表示差し止め|認めず |男性の|逮捕歴、|京都地裁


東京&神奈川|の|カフェで|「トマトフェア」|が|開催されるよ|ぉ~♪ テラス|席で|トマトカクテル&フードを|楽しめるんだって!!|


<東京マラソン>ネットに|爆弾テロ予告| |容疑の|男を|書類送検


体調が|悪いときに|オススメしたい|「生姜だし|明太子茶漬け」|


TOKIO城島|茂&国分太一、|関ジャニ∞丸山|隆平が|石垣島マグロ|釣り対決に|参戦|『ぐるナイ』|


超絶アクション|てんこ盛りの|「エクスペンダブルズ3」|最新予告編が|完成


エボラ拡大|「非常事態」| |アフリカ西部、|未承認薬使用|も|


田中将大投手、|意外な場所で|ファンサービス|


孫社長、|Tモバイル買収|を|“|諦めない”|と|海外報道 |米1,2位打倒|に|向けた今後の|課題と|は|


2020年の|お土産に?Twitter|で|話題の|「寿司シューズ」|が|気に|なる


これだけ|は|改めて!|つい|食べ過ぎて|しまう人に|共通する|「ある習慣」|と|は|


ホラー映画で|最初の|犠牲者に|なりそうな人1位|「いちゃ|いちゃ|して|いるカップル」|


コートジボワールの|カカオ農園で|働く人たちが| |“|生まれて|初めて|”| |チョコレートを|口に|した瞬間の|動画


「ほぇええええ...」|気持ちよさそう|に|シャワーを|浴びるワンコの|うっとり|顔が|かわいすぎて|暑さが|吹き飛びそう♪|


バイトの|履歴書に|職歴|「ニコニコ|動画の|歌い手」|と|記載する猛者が|現れるwwwww


○|○|上手が|恋を|制す!?| |女子に|聞いた|「狙った男性を|必ず|落とす|『銛ガール』|の|特徴10」|


能年玲奈、|将来に|悩む中高生に|「頭で|考えるより|も|飛び込んで」|と|アドバイス


婚約してた彼氏と|別れさせられた


世界政府から|案内状来たwwwwwww


「流れ星」|ちゅうえい |売れて|から|老化始まる


学生も|社会人も!| |朝活から|出会いを|作る方法・|4つ


全高約2メートル、|エヴァンゲリオン初号|機の|人間大フィギュアが|183万円で|販売


トルコライス|とかいう|謎の|食い物wwwwwwwww|


新年会に|も|使って|ます?!都議会|議員の|「政務活動費」|が|公開されました


モーニングスター|で|武装した少年グループ、|男性を|襲撃


北海道の|純白美少女アイドル|グループ|「メルシーココ」|が|東京へ|進出!|メルシーココを|見た記者|「その可愛さは|悪魔を|も|飲み込むモンスター級|の|天使」|


探査機|「ロゼッタ」|が|10年かけて|彗星に|到着、|初の|着陸探査へ|


佐藤健:|「るろ剣」|比プレミア登場|に|5000人絶叫| |53カ国・|地域で|配給へ|


セカオワが|老け顔メイク|で|ライブ!|銀幕デビュー|作の|貴重映像公開!|


緊張して|いませんか?|「男性へ|の|恐れ」|を|なくす単純な3ステップ|


バイトで|家族風呂清掃|してた時に|出会った変な客の|事を|聞いて|くれ - VIPPER|速報 | 2ちゃん|ねるまとめブログ|


マガジンの|将棋マンガが|ルールを|知らない


菅官房長官 |「ロシアの|対抗措置は|遺憾」|


8月11日|(月)|午前3時|9分に|今年最大の|スーパームーン|が|クル━━━━|(゚∀゚)|━━━━!!|


お前ら、|これが|公務員浪人失敗|三十路の|末路だ。|


公務員給与7年|ぶりアップ |人事院勧告、|年収で|8万円


最後の|「あの花夏祭」|が|“|聖地”|秩父で|開催!|茅野愛衣ら声優|陣も!|


ちょっと|変なトコで|お座りしちゃってる犬画像|


Facebookで|最多得票!|ピザハット|「もちポテ明太|ピザ」|が|発売


彡|(^)|(^)|「掃除の|時間や!| |机を|運ぶで!」|


各局女子アナ|6人が|浴衣で|共演“|ハミ出し”|フォト披露


仲井真氏が|正式出馬表明=普天間争点、|保守分裂選挙|へ|―|沖縄知事選


舛添都知事|「じゃあ中国や|韓国が|東京オリンピック|を|ボイコットしたらどう|して|くれるんだよ」|


すき家|「今後は|外国人を|積極的に|採用します」・・|9月末まで|に|ワンオペ終了|を|決定、|牛丼は|値上げ


ノンスタ井上|“|お持ち帰り報道|”|を|否定|「友達ばっかり」|


宮崎駿監督が|「新作に|意欲」| |鈴木敏夫氏が|明かす |スタジオジブリ解体|報道は|否定


CHARAが|18才年下の|ドラマーと|手つなぎデート| |その出会いは|


みんなの|つぶやき | <|職場の|妊婦>初期の|無理厳禁 |必要な上司の|配慮は|


人間の|ちっぽけさを|実感させられる雄大な自然の|写真28選


バカしか|読まない捏造の|朝日新聞|「助けて!|慰安婦問題を|捏造して|世界中に|宣伝して|日本の|評価を|落としたら部数が|大幅に|落ちちゃったの!」|


球児無失点復帰|「|(感慨は)|まったく|ない」|


相づちが|うるさい、|横文字が|ウザイ、|友達の|気に|なる癖教えて|


アクアリウム初心者|の|水槽大公開|【日記風】|


従軍慰安婦問題|を|捏造した朝日新聞の|植村隆が|早期退職し大学教授|に|就任予定に|なるも|批判殺到しクビに・・・|今は|北星学園大学の|非常勤講師、|お前ら絶対に|大学へ|電凸しちゃ|駄目だぞ!|


電車と|ホームに|挟まれた男性 |乗客が|電車を|押して|無事救助/オーストラリア|


『コンボイの|謎』|まさかのゲームアプリ化!| |理不尽さそのまま|に、|伝説の|無理ゲー復活|


睡眠中の|肌や|のどを|乾燥から|守る|「猫かぶりマスク」|を|発売 - フェリシモ| |

@kyu999
Copy link
Author

kyu999 commented Aug 10, 2014

TODO:

  1. クォーテーション
  2. 空白の扱い
  3. 開き括弧の連続

@kyu999
Copy link
Author

kyu999 commented Aug 10, 2014

あなたは|いくつ知ってる?|スタバの|裏メニューまとめ|

雲南省地震 |被災地の|「泥水ラーメン」|報道に、|「ウソだ、|信じるな」|と|報じた環球網| |一転して|事実を|認め|「謝罪」=中国メディア| |(1/2)|

【Twitter】|焦げたホットケーキが|余りに|美しすぎると|話題

イオンに|異変?|スーパー不振|で赤字寸前 |遅れる消費増税|対策、|首都圏連合に|暗雲か||ビジネスジャーナル/Business| |Journal |スマホ

水素で|動く燃料電池|車、|200万~300万円|補助へ|

「日本一綺麗」|15歳体操天才|少女デビュー| - スポーツ|ニュース : |nikkansports.com

トカゲなんて|序の口!|動物園の|ようなメニューが|並ぶ|「珍獣屋」|

ハーマイオニーより|可愛い外国人|を|見たことが|ない

阿部懲罰交代!|G投手陣の|小林“|支持率”じわじわ|上昇中

加護亜依、|細すぎ!|ビキニで|太る宣言

全米で|話題沸騰の|効果絶大ダイエット|『ホール30ダイエット』|と|は?|

似顔絵や|指輪の|写真公開 |段ボール女性|遺体

「合コンで| |“|1杯目” |に|注文したら好印象な飲み物」|ベスト3を|発表しちゃうよ|ぉ~! 第1位|は|意外に|も|「とりあえず|ビール」|だって!!!|

ご当地アンテナショップ|の|有料試飲の|コストパフォーマンスが|異常!|

原幹恵の|ムチムチボディーwww|

ダイエット中|は|絶対避けて!|食べると|「お腹が|どんどん|太る」|フルーツ5つ

「マツコ&有吉」|人気の|裏に|2層構造”?| |深夜に|テレビを|見ない層が|『怒り新党』|に|ハマる理由|(東洋経済オンライン)|

<野球部員落雷|死>|現場の|高校、|全部活を|10日まで|中止|(毎日新聞)|

東京の|芸人の|多くは|「アンチ島田紳助」| |復帰できて|も|関西ローカル|番組のみ?|

『HERO』|で|光ったキャバ嬢|役・|丸高愛実、|ハマリ役の|背景に|あった過去の|役柄

オリジナルカクテル|も|作れちゃう!?|「ファミレス呑み」|の|進化が|止まらない!|

ケイト・|モスが|ジャスティン・ビーバーに|説教!|「礼儀を|わきまえなさい」|

乗用車が|歩道乗り上げ暴走=|女性軽傷、|運転手行方追う―|警視庁

第1子出産の|蛯原友里の|双子妹・|英里、|結婚10年目|で|出産を|決意した理由

学校や|職場で|チヤホヤされる女性に|共通する6つの|ポイント

水泳部男子、|強制わいせつ|罪

今年の|コミケが|ヤバい・・・|死人が|出るぞ|wwwwwwwwwwwwwww

先発の|本田が|先制アシスト|含む2点に|絡む...ミラン|が|チーバスに|快勝

哀川翔、|特異?|な教育方針 |娘が|明かす|「家で|も|このままです」|

に|おってたらや|だな......女子|は|汗の|ニオイを|どう|防いでる?|

男性に|聞いた!| |「一緒に|食事すると|まずくなる......二度|と|食事に|誘いたくない女性」|の|特徴5選

ユッキーナ、|ママ友問題について|語る

川口春奈ミニ|スカで|初体験始球式|

台風第11号| |南大東島の|東南東を|北北西へ|

小学1年生の|女の子の|顔を|ペロペロした犯人が|リアル亀仙人|wwwwwwwwwwwwwwwww|

これだから|やめられない!|学校や|職場恋人の|特権・|4つ

大島優子が|二輪免許取得| |さっそく|バイクに|乗って|ドライブ

この画像が|キモオタの|心理を|的確に|表現してる

ミタパン、|西武・|金子侑と|熱愛!|一度は|破局も|先月復活

マクドナルドと|消費者が|"共創ソース"を|開発!| |代表ソースに|選ばれたのは!?|

結婚したい!| |美熟女TOP|10

ナポリに|敗戦も|手ごたえを|感じるバルセロナの|ペドロと|ラキティッチ

日本史上、|一番ひどい悪人だと|思う1位|「明智光秀」|

全日空787―|9型機就航

納豆の|パキッ|と|たれ考えたやつwwwww|

新生VAIO|3モデルが|1万1016円|引きに| |購入済みの|人に|は|差額ぶんを|返金対応

視聴率23%|超 |かよ役の|黒木華が|明かす|「蓮子と|伝助、|おでこに|チュは|アドリブ」|

adidasから|心拍ゾーンを|視認できる“|超本気”なウェアラブルが|登場

「これは|奴隷契約」|安室奈美恵 |超強気な独立騒動|の|裏

癒し系に|見える、|休日リラックス|モードの|眉メイク

激写!|江頭2:50、|高視聴率男の|意外な素顔 |真面目で|紳士、|ストイックで日々鍛錬...

東海大相模が|“|4本の|矢”で|松本に|挑む - 高校野球|ニュース : |nikkansports.com

8月から|は|やり方変えて!!|星座別・|彼の|落とし方の|ツボ

ささいなことだけど、|自分の|中で|は|めっちゃ|イラっと|する許せないことは?|

「かたじけない」|「ござる」|だけ|じゃ|ない!| |武士語4選

俺が|ヤクザに|気に入られて|ヤクザの|女で|童貞切った話

劇場版|『中二病で|も|恋が|したい!』|が|テレビ初放送!|

エボラ出血熱 |リベリアで|非常事態宣言|

O型彼氏と|O型彼女が|上手に|交際するコツ・|4つ

GACKT破局|を|後悔|「ボクは|まだまだ|ガキん|ちょ。|本当に|ありがとう。|伝われば|いいよ|な」|

ミタパン|「めざまし」|出演も|熱愛触れず、|淡々|と|スポーツ情報|紹介

ドラマ|「永遠の|0」|キャスト発表|第5弾は|工藤阿須加!!|

診察室で|医師切られ重傷=|男が|車で|逃走−|札幌

花束に|も|なります♪ リアル|すぎる|「フラワーカップケーキ」|

衝撃!|しょこたんがセミ|の|抜け殻まみれ|に!|

お店の|トイレにて|「従業員も|使用することが|あります」| |←|存分に|使えや

ハヤブサ|「兄キ!」| |ワシ|「お前、|うちの|一族じゃ|ないぞ」| |タカ|「お前は|今日から|インコ族だから」| |ハヤブサ|「 」|

未練タラタラ|は|嫌!|後腐れの|ない上手な別れ方・|4選

タイガーが|全米プロ出場|へ!|「痛みは|ない」|

佐村河内守が|新垣隆の|新曲|「交響曲HARIKOMI」|に|ダメ出し!|

バカ4人組が|線路に|進入wwwwwwww|

天皇杯 |札幌5発!|前橋に|圧勝 - 天皇杯|ニュース

明徳義塾“|馬淵節”早くも|さく裂!|智弁・|岡本を|「敬遠しないと|は|言わん」|

10代2人、|高波に|さらわれ不明 |牧之原市

<ふるさと納税>|税金軽減上限|2倍に| |15年度から|拡充検討

エボラ欧州上陸。|アフリカは|道に|遺体、|アメリカは|政府が|エボラ特許

出来高変化率|ランキング|(13時台)|~|ゼンショーHD|が|急落、|業績予想の|下方修正を|ネガティブ視|

東京都墨田区|の|東京スカイツリー|に|パティシエ5人|による|スイーツが|登場

救助ヘリ会社|の|容疑者自殺=|スイス

女子バドミントン|部を|譲渡

「安倍首相、|日韓関係改善|に|改めて|意欲示す」|

8月に|最も|増える肌トラブル|「ニキビ」|を|種類別に|ケアしよう!|

次々|と|生傷の|増える女性の|顔......|なぜ|こんなことに?|

自信満々、|安倍総理が|決断!| |9月解散・|総選挙へ| |どこより|も|早い|「全300小選挙区」|当落完全調査| |電撃訪朝で|絶対に|勝つ|「あと4年、|オレが|やるんだ」| | 経済の|死角

夏の|必須アイテム|だけど......。会社|に|「サンダル」|で|出社するのは|アリ?| |ナシ?|

なぜ|私は、|不満ながら|も|彼氏の|世話を|焼いて|しまうのか?|

EXILE |TRIBE、|新曲PVで|歌舞伎町を|闊歩

世界初3Dプリント|で|作られたサックス、|さてその音色は?|

原爆の|日 |黙祷ツイート|に|賛否両論

CLプレーオフ|出場チームが|決定、|スタンダールや|ゼニト進出...|セルティック|敗退

横浜の|隠れ家BAR|『国産クラフト|ビール』|の|飲み比べイベント開催|

MS、|IEに|古いActiveXコントロール|の|起動を|ブロックする仕組みを|導入

全国の|クラフトビール|各種1000円| |横浜の|「隠れ家」|バーで|飲み比べイベント

オービス通知|機能を|追加--iOS|向け地図ナビアプリ|「MapFan+」|が|バージョンアップ

レアル、|仏代表FWベンゼマ|と|2019年まで|の|契約延長を|発表

兵庫県議会、|政活費支出穴|だらけ |野々村氏以外|も|

落雷の|生徒死亡で|部活動休止 |落雷対策を|優先 |愛知

アフリカの|カカオ農家が|初めて|チョコレートを|食べた反応。|

新生Foursqure|アプリが|登場 |まず|大量の|“|好み”登録で|カスタマイズ

VAIO社製|PC、|1万円値下げ|

かき氷の|上から|プレミア焼酎|「森伊蔵」|を|ぶっかける天文館|むじゃきの白熊|を|食べて|みた / 正直|焼酎は|なくて|いい

シリコンバレー101 |(577)| オンライン|ショッピング|の|大海に|Amazonクジラ|を|放つ|「Fire |Phone」|

1945年8月|7日、|広島へ|の|原爆投下を|世界は|どう|報じたか|

9月の|内閣改造 |最大の|サプライズは|小泉進次郎氏|の|入閣か|

この|「生パスタ」|は|一度|味わって|おきたい!|吉祥寺に|ある名店|「スパ吉」|

センチュリー、|お風呂に|浮かぶスピーカー - |7色LEDで|癒しの|バスタイムを|

黙って|いれば|カワイイ!?| |ブスな話し方を|劇的に|変える“|マジックワード|”と|は|

実感!|中国不動産バブル|は|すさまじい

電車と|ホームに|挟まれた男性、|乗客総出で|救出

山本美月、|瞳キラキラ|「輝き大使」|に|

TV未放送|『キルラキル』|第25話先行|上映が|決定!|

キリンチューハイ |ビターズ、|想定の|2倍以上の|売上を|記録

ハワイで|口コミNo.|1を|獲得したパンケーキは、|“|ぐるぐる|”が|目印|エル・|オンライン

ソニーモバイル|純正aptX|対応首掛けBluetooth|ヘッドセット|が|国内発売開始|

土日限定!|マグノリアベーカリーで|ニューヨーカーな朝食が|食べられるように|なる!?|

レスリング、|吉田と|伊調が|1位

今日の|エンジンの|ご機嫌は|いかが?|―|ヤマハ発動機が|「バウリンガル」|エンジン版アプリ|

東電が|見せた′|′|再値上げ回避|′|′|へ|の|覚悟 |原発なし、|給与引き上げ|で|も|第1四半期は|経常黒字に|

IIJの|音声通話機能|付きSIM、|当日引き渡し|店舗が|拡大

カルビーまさかの味覇|味ポテチ、|人気中華調味|料と|初の|コラボ商品。| | Narinari.com

議事録――|会議後の|アクションが|読める|「章立て力」|

(インタビュー)|中国外交は|変わったのか| |ベイツ・ギルさん|

PSMの|ブレーメン戦|で|清武が|ゴール、|酒井宏は|フル出場

考古学博物館|の|倉庫に|6500年前|の|骸骨を|発見。|(ペンシルベニア|州)|

クリスピー・クリームから、|ハロウィンモチーフ|の|ドーナツが|4種類登場

ベーコンで|出来たベッド登場?|美味しくて|香ばしい眠りを|あなたに|♡

“|冷やして|食べる”季節限定ジュレ|で|パンを|もっと|美味しく!|アンデルセン|「ヒュッゲ」|

トヨタ、|足元は|過去最高益で|も|浮かれず

ピクセラ、|車内の|iPhone/|iPadが|テレビに|なるワイヤレスチューナー|を|発売

米Google、|Siriより|も|奥ゆかしいIMアプリ|「Emu」|を|買収

カトパン差し置き、|枡田アナが|センター奪取|に|興奮!?|

原爆の|日 |黙祷ツイート|に|賛否両論

ヤフー検索の|表示差し止め|認めず |男性の|逮捕歴、|京都地裁

東京&神奈川|の|カフェで|「トマトフェア」|が|開催されるよ|ぉ~♪ テラス|席で|トマトカクテル&フードを|楽しめるんだって!!|

<東京マラソン>|ネットに|爆弾テロ予告| |容疑の|男を|書類送検

体調が|悪いときに|オススメしたい|「生姜だし|明太子茶漬け」|

TOKIO城島|茂&国分太一、|関ジャニ∞丸山|隆平が|石垣島マグロ|釣り対決に|参戦|『ぐるナイ』|

超絶アクション|てんこ盛りの|「エクスペンダブルズ3」|最新予告編が|完成

エボラ拡大|「非常事態」| |アフリカ西部、|未承認薬使用|も|

田中将大投手、|意外な場所で|ファンサービス|

孫社長、|Tモバイル買収|を|“|諦めない”と|海外報道 |米1,2位打倒|に|向けた今後の|課題と|は|

2020年の|お土産に?|Twitterで|話題の|「寿司シューズ」|が|気に|なる

これだけ|は|改めて!|つい|食べ過ぎて|しまう人に|共通する|「ある習慣」|と|は|

ホラー映画で|最初の|犠牲者に|なりそうな人1位|「いちゃ|いちゃ|して|いるカップル」|

コートジボワールの|カカオ農園で|働く人たちが| |“|生まれて|初めて|” |チョコレートを|口に|した瞬間の|動画

「ほぇええええ...」|気持ちよさそう|に|シャワーを|浴びるワンコの|うっとり|顔が|かわいすぎて|暑さが|吹き飛びそう♪|

バイトの|履歴書に|職歴|「ニコニコ|動画の|歌い手」|と|記載する猛者が|現れるwwwww

○|○|上手が|恋を|制す!?| |女子に|聞いた|「狙った男性を|必ず|落とす|『銛ガール』|の|特徴10」|

能年玲奈、|将来に|悩む中高生に|「頭で|考えるより|も|飛び込んで」|と|アドバイス

婚約してた彼氏と|別れさせられた

世界政府から|案内状来たwwwwwww

「流れ星」|ちゅうえい |売れて|から|老化始まる

学生も|社会人も!| |朝活から|出会いを|作る方法・|4つ

全高約2メートル、|エヴァンゲリオン初号|機の|人間大フィギュアが|183万円で|販売

トルコライス|とかいう|謎の|食い物wwwwwwwww|

新年会に|も|使って|ます?!|都議会議員の|「政務活動費」|が|公開されました

モーニングスター|で|武装した少年グループ、|男性を|襲撃

北海道の|純白美少女アイドル|グループ|「メルシーココ」|が|東京へ|進出!|メルシーココを|見た記者|「その可愛さは|悪魔を|も|飲み込むモンスター級|の|天使」|

探査機|「ロゼッタ」|が|10年かけて|彗星に|到着、|初の|着陸探査へ|

佐藤健:|「るろ剣」|比プレミア登場|に|5000人絶叫| |53カ国・|地域で|配給へ|

セカオワが|老け顔メイク|で|ライブ!|銀幕デビュー|作の|貴重映像公開!|

緊張して|いませんか?|「男性へ|の|恐れ」|を|なくす単純な3ステップ|

バイトで|家族風呂清掃|してた時に|出会った変な客の|事を|聞いて|くれ - VIPPER|速報 | 2ちゃん|ねるまとめブログ|

マガジンの|将棋マンガが|ルールを|知らない

菅官房長官 |「ロシアの|対抗措置は|遺憾」|

8月11日|(月)|午前3時|9分に|今年最大の|スーパームーン|が|クル━━━━|(゚∀゚)|━━━━!!|

お前ら、|これが|公務員浪人失敗|三十路の|末路だ。|

公務員給与7年|ぶりアップ |人事院勧告、|年収で|8万円

最後の|「あの花夏祭」|が|“|聖地”秩父で|開催!|茅野愛衣ら声優|陣も!|

ちょっと|変なトコで|お座りしちゃってる犬画像|

Facebookで|最多得票!|ピザハット|「もちポテ明太|ピザ」|が|発売

彡|(^)|(^)|「掃除の|時間や!| |机を|運ぶで!」|

各局女子アナ|6人が|浴衣で|共演“|ハミ出し”フォト披露

仲井真氏が|正式出馬表明=普天間争点、|保守分裂選挙|へ|―|沖縄知事選

舛添都知事|「じゃあ中国や|韓国が|東京オリンピック|を|ボイコットしたらどう|して|くれるんだよ」|

すき家|「今後は|外国人を|積極的に|採用します」・・|9月末まで|に|ワンオペ終了|を|決定、|牛丼は|値上げ

ノンスタ井上|“|お持ち帰り報道|”を|否定|「友達ばっかり」|

宮崎駿監督が|「新作に|意欲」| |鈴木敏夫氏が|明かす |スタジオジブリ解体|報道は|否定

CHARAが|18才年下の|ドラマーと|手つなぎデート| |その出会いは|

みんなの|つぶやき |<職場の|妊婦>|初期の|無理厳禁 |必要な上司の|配慮は|

人間の|ちっぽけさを|実感させられる雄大な自然の|写真28選

バカしか|読まない捏造の|朝日新聞|「助けて!|慰安婦問題を|捏造して|世界中に|宣伝して|日本の|評価を|落としたら部数が|大幅に|落ちちゃったの!」|

球児無失点復帰|「|(感慨は)|まったく|ない」|

相づちが|うるさい、|横文字が|ウザイ、|友達の|気に|なる癖教えて|

アクアリウム初心者|の|水槽大公開|【日記風】|

従軍慰安婦問題|を|捏造した朝日新聞の|植村隆が|早期退職し大学教授|に|就任予定に|なるも|批判殺到しクビに・・・|今は|北星学園大学の|非常勤講師、|お前ら絶対に|大学へ|電凸しちゃ|駄目だぞ!|

電車と|ホームに|挟まれた男性 |乗客が|電車を|押して|無事救助/オーストラリア|

『コンボイの|謎』|まさかのゲームアプリ化!| |理不尽さそのまま|に、|伝説の|無理ゲー復活|

睡眠中の|肌や|のどを|乾燥から|守る|「猫かぶりマスク」|を|発売 - フェリシモ| |

@kyu999
Copy link
Author

kyu999 commented Aug 10, 2014

追記:
 1. クォーテーションは特殊な全角開閉区分けありの開バージョンさえ除外したらうまくうごく。title_cleanerのnormalizeを修正しよう。
 2. クォーテーションや括弧の連続への対処がまだ。
 3. これはどっちでもいいんだけど、空白の扱い。空白の前だけにするか後ろだけにするか両方で区切るのか。

@kyu999
Copy link
Author

kyu999 commented Aug 10, 2014

-- coding:utf-8 --

import re
import unicodedata
import MeCab
import os
import title_cleaner

class SpeechTitleSplitter(object):
"""This class split a given title and produces split points for beatiful rendering of that by the simple way"""

def __init__(self):
    self.hiragana_pattern = re.compile(u'[ぁ-ん]+')
    self.kanji_pattern = re.compile(u'[一-龠]+')
    self.katakana_pattern = re.compile(u'[ァ-ヴ]+')
    self.alphanumeric_pattern = re.compile(u'[a-zA-Z0-9]+')
    #開閉の区分けがある全角クォーテーションをleft_kakko, right_kakkoにいれているが、これはテキストエディタの自動変換によって生じたものなのでもし入り込まないと断定できるならこのパターン系には一切入れる必要がなくregulateの中で対処する。逆に必ず入り込むようなことがあるのならregulateの方を変更する。
    self.kigou_pattern = re.compile(u'[!?:;/〜。、!\#$%&\*+,-./・:;<==>?]+')
    self.left_kakko_pattern = re.compile(u'([\[\{{[「『((⦅〈《〔〘【〖<])')
    self.right_kakko_pattern = re.compile(u'[}]」』))⦆〉》〕〙】〗>]+')

def is_kind_base(self, pattern, letters):
    """
    文字種かどうかを調べるための関数のベース関数。判定は1文字でも含まれてたらTrue, else False
    1文字ごとの判定にはこれを活用できる。
    """
    if pattern.match(letters):
        return True
    else:
        return False

def is_hiragana(self, letters):
    return self.is_kind_base(self.hiragana_pattern, letters)

def is_kanji(self, letters):
    return self.is_kind_base(self.kanji_pattern, letters)

def is_katakana(self, letters):
    return self.is_kind_base(self.katakana_pattern, letters)

def is_alphanumeric(self, letters):
    return self.is_kind_base(self.alphanumeric_pattern, letters)

def is_kigou(self, letters):
    return self.is_kind_base(self.kigou_pattern, letters)

def is_left_kakko(self, letters):
    return self.is_kind_base(self.left_kakko_pattern, letters)

def is_right_kakko(self, letters):
    return self.is_kind_base(self.right_kakko_pattern, letters)

def is_quote(self, letter):
    quotes = [u"\"",u"\'",u"”",u"’"]
    if letter in quotes:
        return True
    else:
        return False

def get_feature(self, node):
    """
    品詞等の情報をnodeから取り出してunicode化する
    """
    features = node.feature.split(",")
    unicoded_features = []

    for each_feature in features:
        unicoded_features.append(unicode(each_feature, "utf-8"))

    return unicoded_features    

def separate(self, sentence): 
    """
    token単位でiterateして分割
    """

    #MeCabは半角空白を認識しないので全角空白に置き換える
    encoded_sentence = sentence.replace(u" ", u" ").encode("utf-8")

    if len(encoded_sentence) <= 0:
        return None

    else:

        tagger = MeCab.Tagger("-O wakati")
        node = tagger.parseToNode(encoded_sentence)

        break_points = []            
        current_position = 0

        #現在つながっている長さ
        chunk_len = 0

        pre_node = node
        current_node = node.next

        while current_node:

            if not node.surface:
                node = node.next
                continue 

            else:
                breakable = False                    

                unicoded_surface = unicode(current_node.surface, "utf-8")
                current_position += len(unicoded_surface)

                this_len = len(unicoded_surface)
                chunk_len += this_len

                pre_feature = self.get_feature(pre_node) 
                current_feature = self.get_feature(current_node)

                #助詞もしくは副詞の後は切る
                if current_feature[0] == u"助詞" or current_feature[0] == u"副詞":
                    breakable = True  

                #記号の後は切る    
                elif current_feature[0] == u"記号":
                    breakable = True

                #長い名詞は切る。ただし数以外
                elif chunk_len > 5 and pre_feature[0] == u"名詞" and current_feature[0] == u"名詞" and  not current_feature[1] == u"数":
                    breakable = True

                #whether break or not    
                if breakable:
                    break_points.append(current_position)
                    chunk_len = 0

                #update cursor    
                pre_node = current_node
                current_node = current_node.next

        return break_points

def regulate(self, breaks, sentence):
    """
    文字単位でiterateする。必要以上に区切られていたらその修正もする。
    """

    pre = sentence[0]
    now = ""
    found_quotes = []
    last_quote = None

    for i, char in enumerate(sentence):

            now = sentence[i]        

            pre_was_broken = not i == 0 and i in breaks

            now_was_broken = i + 1 in breaks

            #今までで最後に出現したクォーテーション取得
            if found_quotes:
                last_quote = found_quotes[-1]

            #print(last_quote)
            #print(found_quotes)

            #前の文字後にて区切られていたら
            if pre_was_broken:

                #もし右括弧のまえでbreakしてたら取り除く
                if self.is_right_kakko(char):
                    breaks.remove(i)

                #記号の前で区切られてたら取り除く    
                elif self.is_kigou(char):
                    breaks.remove(i)

                #空白は前につける
                elif char == u" ":
                    breaks.remove(i)

                #閉じクォーテーション前で区切られてたら
                elif last_quote == char:
                    breaks.remove(i)


            #前の文字列後が区切られてないけど追加したい場合
            else:

                #もし左括弧系の前が区切られたなかったら区切る
                if self.is_left_kakko(char):
                    breaks.append(i)


            #今の文字後にて区切られていたら    
            if now_was_broken:

                #もし左括弧系の後にbreakしてたら取り除く
                if self.is_left_kakko(char):
                    breaks.remove(i + 1)

                #もし開きクォーテーションなら    
                elif not last_quote == char and self.is_quote(char):
                    breaks.remove(i + 1)

            #今の文字後で区切られてないけど追加したい場合    
            else:

                #もし右括弧系の後が区切られてなかったら区切る
                if self.is_right_kakko(char):
                    breaks.append(i + 1)

            #update
            #閉じクォーテーションならそのセットを取り除く
            if last_quote == char:
                found_quotes.pop()
                last_quote = None
            elif self.is_quote(char):
                found_quotes.append(char)

            pre = now

    return breaks

def get_break_points(self, sentence): 
    frequent_breaks = self.separate(sentence)
    return self.regulate(frequent_breaks, sentence)

def visualize(self, break_points, sentence):
    """
    タイトル分割の視覚化
    """
    formatted_sentence = []

    for i, char in enumerate(sentence):
        formatted_sentence.append(char)

        if i + 1 in break_points:
            formatted_sentence.append("|")

    return "".join(formatted_sentence)

def break_and_visualize(self, sentence):
    """
    単体動作確認用
    """
    breaks = self.get_break_points(sentence)
    print(self.visualize(breaks, sentence))

def checking(self):
    """
    複数動作確認用
    """

    f = open("sample_title.txt", "r")

    lines = f.readlines()
    cleaner = title_cleaner.TitleCleaner()

    for line in lines:
        unicoded_line = cleaner.normalize(unicode(line, "utf-8"))
        self.break_and_visualize(unicoded_line)

    f.close()

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment