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

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

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

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

Ubuntu

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

Q&A

1回答

1605閲覧

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

aoisj

総合スコア27

Python 3.x

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

Ubuntu

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

0グッド

0クリップ

投稿2017/11/27 07:04

編集2017/11/27 07:49

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

###実装中のプログラム

python

1#!/usr/bin/env python3 2# -*- coding: utf-8 -*- 3 4""" 5トピックモデル(入力:青空文庫の.txtファイル) 6各ファイルの管理可能 7形態素解析対象:名詞(代名詞,非自立名詞,数,固有名詞を除く) 8""" 9import time 10import glob 11import urllib.request 12from bs4 import BeautifulSoup 13import MeCab 14from gensim import corpora, models 15 16t0 = time.time() 17 18html = urllib.request.urlopen('http://www.aozora.gr.jp/') 19soup = BeautifulSoup(html) 20 21""" 22file_list[file_no]:ファイル番号file_noのファイル名 23""" 24file_list = glob.glob('novel_set/*.txt') 25 26#形態素解析(文字列を改行位置で区切って分割) 27mecab = MeCab.Tagger ("-Ochasen") 28 29texts = [] 30for file in file_list: 31 f = open(file, "r",encoding = "utf-8") 32 text = f.read() 33 f.close() 34 chunks = mecab.parse(text).splitlines() 35 36 #絞り込み 37 sels = [] 38 for chunk in chunks: 39 cols = chunk.split('\t') 40 if len(cols) >= 4: 41 parts = cols[3].split('-') 42 #指定した品詞で始まっている場合 → true 43 if parts[0].startswith('名詞'): 44 #代名詞,非自立名詞,固有名詞,数を含めない 45 if parts[1] in ['代名詞','非自立','固有名詞','数']: 46 continue 47 #形態素を追加 48 #sels:形態素(原形)のみの行列 49 sels.append(cols[2]) 50 texts.append(sels) 51 52dictionary = corpora.Dictionary(texts) 53corpus = [dictionary.doc2bow(text) for text in texts] 54 55t1 = time.time() 56 57#トピック数 58num_topics = 10 59 60#LDAモデルに投入 61lda = models.LdaModel(corpus = corpus, id2word = dictionary,num_topics = num_topics) 62 63t2 = time.time() 64 65print(lda) 66 67#各トピックにおける各トークンの出現確率を係数で表示 68for topic in lda.show_topics(-1): 69 print(topic) 70 71corpus_time = t1 - t0 72print('コーパス生成時間:%f秒'%corpus_time) 73 74lda_time = t2 -t1 75print('LDAモデル生成時間:%f秒'%lda_time) 76 77total_time = t2 - t0 78print('合計時間:%f秒'%total_time)

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

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

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

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

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

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

guest

回答1

0

青空文庫からテキストファイルと

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

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

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

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

投稿2017/11/29 09:07

can110

総合スコア38266

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

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

aoisj

2017/11/30 09:40

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問