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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

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

Python

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

Q&A

解決済

1回答

513閲覧

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

rhkt55

総合スコア8

Python 3.x

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

Python

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

0グッド

1クリップ

投稿2018/01/07 16:04

編集2018/01/08 11:47
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, '%')

txt

1{"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あたりを参考にしましたができなかったのでどうかよろしくお願いします

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

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

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

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

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

KojiDoi

2018/01/07 16:17

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

回答1

0

ベストアンサー

まず、関数remove_markupについて。

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

python

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

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

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

remove_markup(lines)

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

removed_str = remove_markup(lines)

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

次に、

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

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

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

投稿2018/01/08 17:38

KojiDoi

総合スコア13671

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問