7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

文字列が中国語(簡体字)かどうか雑に判定する

Posted at

動機

ここしばらくアルバイトでWebクローリングのようなことをやっているんだけど,回しているとクローラが結構な確率で中国語のウェブページを取ってくる.
そうして取ってきたページは時折悪質なリンクを含んでいるために,クローラがそのようなリンクを踏んでしまって,同様に悪質な(中国語の)ウェブページばかりを取ってくる事態に陥ってしまう.
クローリングの目的を達成するために中国語のウェブページを巡回する必要はなさそうなので,中国語のウェブページを検出して弾きたいと思った.

(ちなみに)今まで取っていた手法

今まではHTTP/HTMLのヘッダや chardet などのライブラリを用いて文字コードの判別をすることで中国語のウェブページかどうかを判別していた.

しかし世の中は少しずつ良くなっており,その一環として世界中のウェブページの文字コードがUTF-8に統一されつつある.
大変に結構なことではあるのだが,そのせいで文字コードによる言語判定ではうまく回らなくなってきた.
そこでもう少し直接的なアプローチを取りたい.

今回の解決策

とりあえずコードはこんな感じ.

def is_zh(in_str):
    """
    SJISに変換して文字数が減れば簡体字があるので中国語
    """
    return (set(in_str) - set(in_str.encode('sjis','ignore').decode('sjis'))) != set([])

コメントに書いた通りだが,考え方としては入力で渡されるstr型の変数をSJISに変換する段階でSJISに含まれない簡体字が削除されることを利用する.

当初はfilterを使ってASCII文字を抜いたりとか,扱いに慣れてるlist型での処理からset型への変換とか,色々してたんだけどそういう不要なものを削っていったら随分とシンプルなものにまで収束してしまった.

何か問題があったら(やさしく……)教えていただけると非常に嬉しいです.

参考

7
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?