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

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

ただいまの
回答率

90.62%

  • Python 3.x

    5853questions

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

python3 ngramの方法について

解決済

回答 1

投稿 編集

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

rysy_9

score 6

 前提・実現したいこと

更新されたソースコードを続行してもからのファイルが誕生してしまう。
うまく読み込めていないのがどこなのかいまいちわからない。

 発生している問題・エラーメッセージ

エラー自体は消えました

 更新されたソースコード

# coding: utf-8

import sys
import json
import MeCab
import urllib.request, urllib.error, urllib.parse
from collections import defaultdict
from operator import itemgetter
from bs4 import BeautifulSoup
from bs4 import NavigableString


class Ngram():

    def __init__(self, N=3):
        self.N = N
        self.tagger = MeCab.Tagger("-Owakati")

    def get(self, text, ngram=None):
        seq = self.tagger.parse(text)

        if ngram is None:
            ngram = [defaultdict(int) for x in range((self.N + 1))]
            ngram[0] = None

        for i in range(len(seq)):
            for n in range(1, self.N + 1):
                idx = i - n + 1  # check ngram is valid range
                if idx >= 0:
                    key_words = []
                    for j in range(idx, i+1):
                        key_words.append(seq[j])
                    key = '_'.join(key_words)
                    ngram[n][key] += 1

        return ngram


class HTMLParser():

    def get(self, url):
        try:
            c = urllib.request.urlopen(url)
        except:
            print("Could not open %s" % url)
            return ""

        soup = BeautifulSoup(c.read(), "lxml")
        text = '\n'.join(self.__getNavigableStrings(soup))
        return text

    def __getNavigableStrings(self, soup):
        if isinstance(soup, NavigableString):
            if type(soup) not in (Comment, Declaration) and soup.strip():
                yield soup
            elif soup.name not in ('script', 'style'):
                for c in soup.contents:
                    for g in self.__getNavigableStrings(c):
                        yield g


if __name__ == "__main__":

    f = open("urls.json", "r")
    urls = json.load(f)
    f.close()
    print("Count of urls : " + str(len(urls)))

    N = 10
    hp = HTMLParser()
    ng = Ngram(N)

    ngram = None
    for url in urls:
        text = hp.get(url)
        ngram = ng.get(text, ngram)

    for n in range(1, (N + 1)):
        f = open('outputs/{:02d}.tsv'.format(n), 'w')
        out = ""
        for k, v in sorted(list(ngram[n].items()), key=itemgetter(1), reverse=True):
            out += "{}\t{}\n".format(k, v)
        f.write(out)
        f.close()

 URLS.JSONのファイル

["https://news.yahoo.co.jp/profile/settings/", "https://headlines.yahoo.co.jp/hl?a=20180601-00000063-dal-ent", "https://news.yahoo.co.jp/feature", "https://news.yahoo.co.jp/pickup/6284612", "https://news.yahoo.co.jp/pickup/6284600", "https://news.yahoo.co.jp/ranking/access?ty=t", "https://news.yahoo.co.jp/polls/", "https://news.yahoo.co.jp/hl?c=c_spo", "https://news.yahoo.co.jp/hl?c=loc", "https://www.yahoo-help.jp/app/noscript", "https://headlines.yahoo.co.jp/hl?a=20180601-00000520-san-pol", "https://news.yahoo.co.jp/search/advanced", "https://news.yahoo.co.jp/pickup/6284614", "https://news.yahoo.co.jp/pickup/6284627", "https://news.yahoo.co.jp/photo", "http://news.yahoo.co.jp/", "https://news.yahoo.co.jp/profile/login", "https://news.yahoo.co.jp/ranking", "https://headlines.yahoo.co.jp/purchase/", "https://headlines.yahoo.co.jp/hl?a=20180601-00000002-wordleafs-socc", "https://news.yahoo.co.jp/byline/", "https://headlines.yahoo.co.jp/videonews/jnn?a=20180601-00000013-jnn-soci", "https://news.yahoo.co.jp/ranking/access?ty=v", "https://about.yahoo.co.jp/docs/info/terms/chapter1.html", "https://headlines.yahoo.co.jp/hl?a=20180601-00000010-jij-soci", "https://news.yahoo.co.jp/ranking/access?ty=z", "https://headlines.yahoo.co.jp/videonews/jnn?a=20180530-00000072-jnn-soci", "https://headlines.yahoo.co.jp/article?a=20180601-00542887-shincho-ent", "https://about.yahoo.co.jp/info/mediastatement/", "https://headlines.yahoo.co.jp/docs/copyright.html", "https://news.yahoo.co.jp/byline/kohyoungki/20180531-00085870/", "https://news.yahoo.co.jp/ranking/comment/rate?ty=t", "https://news.yahoo.co.jp/ranking/access?ty=b", "https://headlines.yahoo.co.jp/hl?a=20180601-00003575-tokaiv-l23", "https://headlines.yahoo.co.jp/hl?a=20180531-00010002-bfj-soci", "https://news.yahoo.co.jp/hl?c=c_ent", "https://headlines.yahoo.co.jp/hl?a=20180601-00000519-san-pol", "https://news.yahoo.co.jp/pickup/6284617", "https://news.yahoo.co.jp/hl?c=dom", "https://news.yahoo.co.jp/", "https://headlines.yahoo.co.jp/article?a=20180601-00223078-toyo-soci", "https://news.yahoo.co.jp/topics", "https://headlines.yahoo.co.jp/videonews/", "https://news.yahoo.co.jp/hl?c=c_sci", "https://news.yahoo.co.jp/list/", "https://headlines.yahoo.co.jp/videonews/jnn?a=20180531-00000058-jnn-soci", "https://headlines.yahoo.co.jp/hl?a=20180601-00003574-tokaiv-l23", "https://about.yahoo.co.jp/docs/info/terms/", "https://www.yahoo-help.jp/app/home/p/575/", "https://about.yahoo.co.jp/info/msiesp/", "https://news.yahoo.co.jp/hl?c=c_life", "https://news.yahoo.co.jp/flash", "https://headlines.yahoo.co.jp/hl?a=20180601-00226047-nksports-socc", "https://news.yahoo.co.jp/pickup/6284619", "https://headlines.yahoo.co.jp/docs/tokuteisho.html", "https://news.yahoo.co.jp/byline/oshimakazuto/20180531-00085867/", "https://news.yahoo.co.jp/hl?c=bus", "https://headlines.yahoo.co.jp/hl?a=20180531-00000001-withnews-sci", "https://headlines.yahoo.co.jp/hl?a=20180601-00010002-khbv-l04", "https://www.yahoo-help.jp/app/answers/detail/a_id/43880/p/533/", "https://news.yahoo.co.jp/byline/fuwaraizo/20180531-00085864/", "https://feedback.ms.yahoo.co.jp/voc/news-voc/input", "https://news.yahoo.co.jp/hl?c=c_int", "https://news.yahoo.co.jp/pickup/6284621", "https://news.yahoo.co.jp/zasshi", "https://headlines.yahoo.co.jp/article?a=20180601-00055904-gendaibiz-bus_all", "https://www.yahoo-help.jp/app/answers/detail/p/575/a_id/60137", "https://news.yahoo.co.jp/pickup/6284618"]
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • quiqui

    2018/06/01 19:33

    やりたいことはわかりました(私には)。が、ここに書いてもしょうがないですよ。今おかしいのが、webからの取得とhtmlのparseなのか、形態素解析なのか、ngramを獲得するところなのか、頻度をカウントしているところなのか、どこまで確認したのか、あたりも書くといいと思います。

    キャンセル

  • rysy_9

    2018/06/01 19:41

    quiqui様私の浅はかな知識に質問の仕方を細かく教授いただきありがとうございました。質問する立場としてもう少し学習するとともに、分かりやすくできるよう努力します。

    キャンセル

  • quiqui

    2018/06/01 20:05

    いや、質問を書きかえるか追記しましょうってことなんですけど。ここをコメント欄と勘違いしてませんか?

    キャンセル

回答 1

checkベストアンサー

0

本当にpython3系なら、MeCabバインディングのparseの引数はbytesではなくstrを受け取ることになっています。
手元環境でも同様のエラーが再現しました。parseの引数のtext.encode('utf-8')textにすると出なくなりました。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/06/01 15:52

    そこを直したところ

    Traceback (most recent call last):
    File "z.py", line 79, in <module>
    f = open('outputs/{:02d}.tsv'.format(n), 'w')
    FileNotFoundError: [Errno 2] No such file or directory: 'outputs/01.tsv'

    のようにエラー文が出ました。出力するところはそのように処理したらいいでしょうか?

    キャンセル

  • 2018/06/01 15:55

    それはoutputsディレクトリがないだけなんじゃという気がします。先に作っておく必要があるのですが

    キャンセル

  • 2018/06/01 16:00

    a.tsvのように適当に指定したら何も書かれていないファイルが出来上がってしまいました。

    キャンセル

  • 2018/06/01 16:07

    プログラムを更新いたしました。

    キャンセル

  • 2018/06/01 16:13

    とりあえずそこまで動くようになったなら、あとはng.getの返り値とかngramの値とかをprintでもしてデバッグしていけば完成すると思います。ただ結構手間かもしれないので、とりあえず私のアドバイスはここまでにさせてください・・・

    キャンセル

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

  • ただいまの回答率 90.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

  • Python 3.x

    5853questions

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