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

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

ただいまの
回答率

91.37%

  • Python 3.x

    2398questions

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

  • Ubuntu

    847questions

    Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

urllib,BeautifulSoup4を使ったweb情報の取得

受付中

回答 1

投稿 2017/11/27 16:04 ・編集 2017/11/27 16:49

  • 評価
  • クリップ 0
  • VIEW 59

aoisj

score 16

やりたいこと

urllibとBeautifulSoup4に詳しい方に質問です。
複数のテキストファイルからLDAモデル作成するプログラムを実装しています。
実装中のプログラムではテキストファイルをまとめておいたディレクトリにアクセスし、
その中の.txtファイルを入力としているのですが、
urllib,BeautifulSoup4を使って
青空文庫からテキストファイルと
そのテキストファイルのカテゴリ(サイト内の分野別リストに記されているもの)
例:「小説.物語」,「評論.エッセイ.随筆」など
の情報を取得し、
[ファイル名,カテゴリ]というようなリストを作成できるように変更したいので、
どのように変更するべきなのかを教えていただきたいです。。
実装中の部分と今後実装する予定の部分が混在していて見辛いかと思いますが
よろしくお願いします。

実装中のプログラム

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
トピックモデル(入力:青空文庫の.txtファイル)
各ファイルの管理可能
形態素解析対象:名詞(代名詞,非自立名詞,数,固有名詞を除く)
"""
import time
import glob
import urllib.request
from bs4 import BeautifulSoup
import MeCab
from gensim import corpora, models

t0 = time.time()

html = urllib.request.urlopen('http://www.aozora.gr.jp/')
soup = BeautifulSoup(html)

"""
file_list[file_no]:ファイル番号file_noのファイル名
"""
file_list = glob.glob('novel_set/*.txt')

#形態素解析(文字列を改行位置で区切って分割)
mecab = MeCab.Tagger ("-Ochasen")

texts = []
for file in file_list:
    f = open(file, "r",encoding = "utf-8")
    text = f.read()
    f.close()
    chunks = mecab.parse(text).splitlines()

    #絞り込み
    sels = []
    for chunk in chunks:
        cols = chunk.split('\t')
        if len(cols) >= 4:
            parts = cols[3].split('-')
            #指定した品詞で始まっている場合 → true
            if parts[0].startswith('名詞'):
                #代名詞,非自立名詞,固有名詞,数を含めない
                if parts[1] in ['代名詞','非自立','固有名詞','数']:
                    continue
                #形態素を追加
                #sels:形態素(原形)のみの行列
                sels.append(cols[2])
    texts.append(sels)

dictionary = corpora.Dictionary(texts)
corpus = [dictionary.doc2bow(text) for text in texts]

t1 = time.time()

#トピック数
num_topics = 10

#LDAモデルに投入
lda = models.LdaModel(corpus = corpus, id2word = dictionary,num_topics = num_topics)

t2 = time.time()

print(lda)

#各トピックにおける各トークンの出現確率を係数で表示
for topic in lda.show_topics(-1):
    print(topic)

corpus_time = t1 - t0
print('コーパス生成時間:%f秒'%corpus_time)

lda_time = t2 -t1
print('LDAモデル生成時間:%f秒'%lda_time)

total_time = t2 - t0
print('合計時間:%f秒'%total_time)

補足情報

BeautifulSoup4ではURLを扱えない?らしいので最初に見つけたurllibを使っているのですが、Seleniumなどもあるそうで、どちらをつかうのがよいか(それぞれの特徴など)
もアドバイスをいただければと思います。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

+2

青空文庫からテキストファイルと
そのテキストファイルのカテゴリ(サイト内の分野別リストに記されているもの)
例:「小説.物語」,「評論.エッセイ.随筆」など
の情報を取得し、
[ファイル名,カテゴリ]というようなリストを作成できるように変更したいので、

公開中 作家リスト:全てにある公開中 作家別作品一覧拡充版:全て(CSV形式、UTF-8、zip圧縮)を利用するとよいでしょう。
このCSV図書カードURL列から各テキストへののURLが分かります。
また分類番号列にはNDC 289 402などの値が入っています。これよりカテゴリが分かります。詳細はNDCなどで調べてみてください。
また青空文庫FAQにも目を通してみてください。

以下、全般的なアドバイスです。
そろそろプログラムの規模が大きくなってきて、処理の見通しが悪くなっていると感じませんか?
そのような場合は、解決したい問題(処理)を分割するとよいです。

  • 青空文庫から必要なデータをダウンロードしてローカルに保存する処理
  • 保存されたデータからLDAモデルを作成する処理

投稿 2017/11/29 18:07

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/11/30 18:40

    回答ありがとうございます。
    紹介していただいたCSVファイルを開いてみたのですが、
    分野番号列はおそらくI列だと考えられるのですが、
    図書カードURLはそれらしき列がいくつもあったので分かりませんでした。
    見たところ、文字コードによる違い?かと思ったのですが詳しく教えていただけますか?

    キャンセル

  • 2017/11/30 20:02

    青空文庫CSVファイルの構成については以下に情報があります。参照ください。
    https://github.com/aozorahack/hackathon2016/blob/master/doc/csv.md

    キャンセル

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

ただいまの回答率

91.37%

関連した質問

  • 受付中

    形態素解析の結果の際pydotplus、graphvizの結果が白紙出力

    いつもお世話になっております。質問です。 実現したいこと 以下のコードの実行結果がgraph().jpgで出力されるが、真っ白で出力。 しかし画像サイズはそれぞれ別々のサイズで

  • 解決済

    pythonでMecabを利用した語彙解析がうまくできない。

    ●環境 ・Windows Edition:Windows 7 Professional  Service Pack 1 ・pythonバージョン:Python 3.6.2 (v3.

  • 解決済

    mecab 品詞 選択

    やりたいこと 選択したテキストファイル内の文章をmecabを用いて形態素解析し、 品詞(名詞、動詞など)を絞り込みたいと考えています。 現在、テキストファイルの文章を形態素解析する

  • 解決済

    複数のテキストファイルをLDAモデルに

    やりたいこと 複数のテキストファイルを入力とし、指定したトピック数に分類するプログラムを作成したいと考えています。 現在、一つのテキストファイルをLDAモデルに投入するプログラムは

  • 解決済

    python3 配列への正規表現 BeautifulSoup

    <div class="name">吉田<wbr>太郎</div>や<div class="name">田中<wbr>一郎</div> というHTMLを以下のようにfind_all

  • 解決済

    指定した言葉を排除したい

    やりたいこと テキストファイルからトピックモデルを作成するプログラムを実装中なのですが、コーパスを生成するのに用いる辞書に指示語(あれ、ここ、そちら)や、それ自体に重要な意味を持た

  • 解決済

    mecabでセリフのみを抽出したい

    やりたいこと mecabを用いて入力したテキストファイルのセリフ部分(「」や『』で囲まれている部分)の 名詞(代名詞,非自立名詞,数,固有名詞を除く)を取り出して行列selsに格納

  • 解決済

    テキストに番号を付けて管理したい

    困っていること 入力したファイルのトピックを抽出するための前段階として 指定したディレクトリ内の.txtファイルを用いてLDAモデルを作成するプログラムを実装したのですが、 現在の

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

  • Python 3.x

    2398questions

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

  • Ubuntu

    847questions

    Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。