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

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

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

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

Q&A

解決済

1回答

1599閲覧

python3 ngramの方法について

rrrrrrrry

総合スコア20

Python 3.x

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

0グッド

0クリップ

投稿2018/06/01 04:54

編集2018/06/01 07:22

前提・実現したいこと

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

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

エラー自体は消えました

更新されたソースコード

# 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"]

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

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

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

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

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

quickquip

2018/06/01 05:31

改変を加える前は動いていたのか、どう改変したのか、MeCab.Taggerが正常に動くことは確認しているのか、などが知りたいです。
rrrrrrrry

2018/06/01 07:08 編集

mecab.taggerは正常に動きます。プログラム更新したので一度見ていただいてもよろしいですか?
quickquip

2018/06/01 07:30 編集

改変を加える前は動いていたのか、どう改変したのか、って書きましたよね? あと"やりたいこと"が書いてないですよ。単語ngramを1gramから10gramまでの範囲でカウントしたい? のかなと想像しますが、それはこちらの勝手な想像でしかないわけです。コードが**そうなってない**状態なので。
rrrrrrrry

2018/06/01 07:34

改変を加える前は動かしてもいません。そもそもネット上に落ちていたputhon2系のプログラムを3系にまず書き換えました。importの部分で足りない部分を追加したことくらいです。quiquiさんのおっしゃる通りで1-10gramでカウントしていきたいです。今回はサンプルのためyahooのサイトで行なっているだけであります。コードがそうなっていないというのも私には現状理解できていない状態なのでわかりやすく教えていただけるとありがたいです。
quickquip

2018/06/01 08:51

パッとみる範囲でsplitを呼んでないとか、Comment, Declarationが定義されてないとか、読まなくても不完全なソースであることはすぐにわかります。どういう動作を望んで書いているのかわからないです。
rrrrrrrry

2018/06/01 10:05

webページ上の文章をngramの機能を使いでどういう単語が多く頻出されているかを見ていきたいという目的でやっています。
quickquip

2018/06/01 10:33

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

2018/06/01 10:41

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

2018/06/01 11:05

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

回答1

0

ベストアンサー

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

投稿2018/06/01 06:48

hayataka2049

総合スコア30933

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

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

rrrrrrrry

2018/06/01 06: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' のようにエラー文が出ました。出力するところはそのように処理したらいいでしょうか?
hayataka2049

2018/06/01 06:55

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

2018/06/01 07:00

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

2018/06/01 07:07

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

2018/06/01 07:13

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問