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

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

ただいまの
回答率

91.24%

  • Python

    4258questions

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

  • Python 3.x

    2813questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

文字の置換、wikiデータのマークアップの除去を関数によって実装したい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 55

rhkt55

score 2

import re

def remove_markup(str):
    str1 = re.sub(r"'{2,5}", r"", str)
    str2 = re.sub(r"\[\[(.*?)\]\]", r"\1", str1)
    return str2

if __name__ == '__main__':
    docs = {}
    for line in fileinput.input('-'):
        obj = json.loads(line)
        docs[obj['title']] = obj['text']
        for lines in docs[obj['title']].split('\t'):
            remove_markup(lines)
            line_number = 0 #行数
            allkanji = 0
            line_number += 1
            rkan = re.compile("[一-龥]")
            foundkanji = rkan.findall(lines)
            oneline_kanji = len(foundkanji) / len(lines) #1行ごとの漢字の割合
            allkanji += oneline_kanji
            per = round((allkanji / line_number) * 100, 1)
        print(obj['title'], '\t', per, '%')
{"text": "{{otheruses|主に現代のエジプト・アラブ共和国|古代|古代エジプト}}\n{{基礎情報 国\n|略名 =エジプト\n|日本語国名 =エジプト・アラブ共和国\n|公式国名 ='''{{lang|ar|جمهورية مصر العربية}}'''\n|国旗画像 =Flag of Egypt.svg\n|国章画像 =[[ファイル:Coat_of_arms_of_Egypt.svg|100px|エジプトの国章]]\n|国章リンク =([[エジプトの国章|国章]])\n|標語 =なし\n|位置画像 =Egypt (orthographic projection).svg\n|公用語 =[[アラビア語]]\n|首都 =[[カイロ]]\n|最大都市 =カイロ\n|元首等肩書 =[[近代エジプトの国家元首の一覧|大統領]]\n|元首等氏名 =[[アブドルファッターフ・アッ=シーシー]]\n|首相等肩書 =[[エジプトの首相|首相]]\n|首相等氏名 =[[イブラヒーム・メフレブ]]\n|面積順位 =29\n|面積大きさ =1 E12\n|面積値 =1,001,450\n|水面積率 =0.6%\n|人口統計年 =2011\n|人口順位 =\n|人口大きさ =1 E7\n|人口値 =81,120,000\n|人口密度値 =76\n|GDP統計年元 =2008\n|GDP値元 =8,965億<ref name=\"economy\">IMF Data and Statistics 2009年4月27日閲覧([http://www.imf.org/external/pubs/ft/weo/2009/01/weodata/weorept.aspx?pr.x=77&pr.y=19&sy=2008&ey=2008&scsm=1&ssd=1&sort=country&ds=.&br=1&c=469&s=NGDP%2CNGDPD%2CPPPGDP%2CPPPPC&grp=0&a=])</ref>\n|GDP統計年MER =2008\n|GDP順位MER =49\n|GDP値MER =1,621億<ref name=\"economy\" />\n|GDP統計年 =2008\n|GDP順位 =28\n|GDP値 =4,426億<ref name=\"economy\" />\n|GDP/人 =5,898<ref name=\"economy\" />\n|建国形態 =[[独立]]<br />&nbsp;-&nbsp;日付\n|建国年月日 =[[イギリス]]より<br />[[1922年]][[2月28日]]\n|通貨 =[[エジプト・ポンド]] (£)\n|通貨コード =EGP\n|時間帯 =(+2)\n|夏時間 =(+3)\n|国歌名 =我が祖国\n|ISO 3166-1 = EG / EGY\n|ccTLD =[[.eg]]\n|国際電話番号 =20\n|注記 =\n}}\n'''エジプト・アラブ共和国'''(エジプト・アラブきょうわこく)、通称'''エジプト'''は、[[中東]]・[[アフリカ]]の[[共和国]]。[[首都]]は[[カイロ]]。\n\n西に[[リビア]]、南に[[スーダン]]、北東に[[イスラエル]]と隣接し、北は[[地中海]]、東は[[紅海]]に面している。南北に流れる[[ナイル川]]の[[河谷]]と[[三角州|デルタ]]地帯([[ナイル・デルタ]])のほかは、国土の大部分が[[砂漠]]である。ナイル河口の東に地中海と紅海を結ぶ[[スエズ運河]]がある。


このようなテキストファイルの記事本文の漢字の割合を出すためにリンクなどの余計な文字やマークアップを除去コードを関数で実装したいです
言語処理100本ノックの27,28あたりを参考にしましたができなかったのでどうかよろしくお願いします

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • KojiDoi

    2018/01/08 01:17

    提示されているコードで、置換されるべきものは置換されますよね。具体的にどういう文字列をどういう風に置換したいのかの説明をお願いします。それがないと、どの方向に修正すべきかも判断しようがありません。

    キャンセル

回答 1

checkベストアンサー

0

まず、関数remove_markupについて。

とりあえず、単純に削除できるものは最初に削除してしまいましょう。まずwikiにおいてテンプレートを示す{{なんちゃら}}はおそらく漢字の割合を計算する対象に含めるのはナンセンスなのでまるごと削除でいいでしょう。内部リンクを示す[[なんちゃら]]は、単純にカッコを外せばいいので、部分文字列処理などは必要ないはずです。<a href=""></a><br \>なども単純に削除でいい。従って、まずは以下のような感じではないでしょうか。

 前略
 str1 = re.sub(r"{{.*?}}", "", str)
 str1 = re.sub(r"\[\[", "", str1)
 str1 = re.sub(r"\]\]", "", str1)
 str1 = re.sub(r"<a href=.*?>", "", str1)
 以下略。こんな感じで邪魔な箇所を大きなものから順番に消していく。
 return str1

次に、関数呼び出し側について。

まず致命的な間違いが一つあります。

remove_markup(lines)


remove_markupは置換後の文字列を返す仕様ですが、せっかく返ってきた文字列を受け取っていません。これでは苦労が全て水の泡です。

removed_str = remove_markup(lines)


こんな感じにして、以降の処理はremoved_strを相手に行わなければいけません。

次に、

rkan = re.compile("[一-龥]")


これは、漢字にマッチする正規表現としては不適当です。参考

とりあえず気付いたのはこんなところですね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

ただいまの回答率

91.24%

関連した質問

同じタグがついた質問を見る

  • Python

    4258questions

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

  • Python 3.x

    2813questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。