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

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

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

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

Q&A

解決済

1回答

865閲覧

Type error:expected string or bytes-like objectが意味不明

studyprg

総合スコア57

Python 3.x

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

0グッド

0クリップ

投稿2022/12/29 17:04

編集2022/12/30 06:25

前提

自然言語処理について勉強しています。
Wikipediaのdumpデータから本文を抜き出して処理をしようと思ってます。
用意したテキストファイルから段落ごとに分割しtf-idfで計算をして表示したいです.
テキストの処理時にエラーが発生しているようです.
このプログラムのエラーを修正したいです.

実現したいことのリスト

  1. テキストファイルを読みこんで格納
  2. 読み込んだテキストから記号などの削除して日本語のみにする
  3. Gfileは段落ごとに分割,myfileは改行四つで区切る(テキストファイルに区切りとして改行を付与しています.),その後,それぞれを段落ごとに分割した後Mecabで名詞のみ抽出
  4. 処理を実行(tf-idfをアレンジしたもの)

現在の状況

コメントで今の問題の解決案を募集してます.

pythonソースコード

1# -*- coding: utf-8 -*- 2from gensim.models import KeyedVectors 3import math 4import MeCab 5import sys 6import re 7# global 8 9m = MeCab.Tagger() # Ochasenで失敗したのでデフォルト 10 11 12myfile = open('history_0text.txt') # history 13 14Gfile = open('koyamaike.txt') # ガイド文書(koyamaike.txt) 15print("\n\nhistoryテキストとGuideテキストを読み込みました\n\n") 16 17 18removeW = re.compile( 19 20 '[!"#$%&\'\\\\()*+,-./:;<=>?@[\\]^_`{|}~「」〔〕“”〈〉, ,『』【】&*・()$#@。、?!`+¥% ]') 21 22# def 23 24 25def makeG(guide): 26 27 guide = removeW.sub('', guide) # 記号除去 28 for x in range(0, len(guide)-1): 29 guide = [line.split()[0] for line in m.parse( 30 guide[x]).splitlines() if "名詞" in line.split()[-1]] 31 return guide 32 33 34def makeH(history): 35 history = removeW.sub('', history) # 記号除去 36 history = history.split('\n\n\n\n') # 記事分割 37 for y in range(0, len(history)-1): 38 history = [line.split()[0] for line in m.parse( 39 history[y]).splitlines() if "名詞" in line.split()[-1]] 40 return history 41 42 43 44def idfe(t, p): 45 idf = 0 46 x = 0 47 for i in range(0, len(p)-1): 48 if t in p: 49 x += 1 50 if x == 0: 51 x += 0.05 # beta 52 53 idf = len(p)/x 54 idf = math.log(idf) 55 return idf 56 57 58def tfe(t, para): 59 tf = 0 60 s = 0 61 for x in para: 62 s += para.count(x) 63 64 tf = para.count(t)/s 65 66 return tf 67 68 69def idfe_2(t, H): 70 idf2 = 0 71 x = 0 72 for i in range(0, len(H)-1): 73 if t in H[i]: 74 x += 1 75 if x == 0: 76 x += 0.05 # beta 77 78 idf2 = len(H)/x 79 idf2 = math.log(idf2) 80 return idf2 81 82def Rexact(paragraf, history): 83 R = 0 84 for t in paragraf: 85 R += (tfe(t, paragraf)*idfe(t, paragraf)*idfe_2(t, history)) 86 87 return R 88 89 90 91 92 93# main 94history = makeH(myfile) # 段落ごとに分9割された二次元リスト(str) 95G = makeG(Gfile) # 記事ごとに分割された二次元リスト 96for n in range(0, len(G)-1): 97 98 Rdice = {} 99 x = 0 100 y = 0 101 102 y = Rexact(G[n], history) 103 Rdice.setdefault(n, y) 104 105 print(n, "段落のtfidf:", y) 106Rsort_s = sorted(Rdics.items()) 107Rsort_e = sorted(Rdice.items()) 108print(Rsort_s) 109print(Rsort_e) 110print("ended") 111 112exit 113

次にエラーです.

cmd

1% python3 Jtest.py 2 3 4historyテキストとGuideテキストを読み込みました 5 6 7Traceback (most recent call last): 8 File "/Users/***/Jtest.py", line 151, in <module> 9 history = makeH(myfile) # 段落ごとに分9割された二次元リスト(str) 10 File "/Users/daru/python/kennkyu/Jtest.py", line 36, in makeH 11 history = removeW.sub('', history) # 記号除去 12TypeError: expected string or bytes-like object

一応利用するテキストファイルの一部も添付しておきます.

koyamaike.txt

1湖山池 2{{Infobox 湖 3|名称=湖山池 4|画像=[[画像:湖山池.jpg|right|300px]] 5|所在地={{JPN}} [[鳥取県]][[鳥取市]] 6|面積=7 7|周囲長=18 8|最大水深=6.5 9|平均水深= 10|貯水量= 11|標高=0 12|成因=[[海跡湖]] 13|淡汽=[[汽水]] 14|湖沼型=[[富栄養湖]] 15|透明度=0.7 16}} 17'''湖山池'''(こやまいけ)は、[[鳥取県]][[鳥取市]]の北部にある[[汽水湖]]。「[[池]]」と付く湖沼の中では[[日本]]最大の広さである。 18== 概要 == 19湖山池は鳥取県内では、[[中海]]の次に大きい湖沼である。古代に[[日本海]]から湾入した場所が、[[砂丘]]の発達や[[堆積]]により、海と分離されてできた[[海跡湖]]である。大小多数の小[[島]]が浮かぶ。最大の島である[[青島 (鳥取県)|青島]]には、湖岸から架橋されており、桜の木が多数植えられた道路で徒歩や自転車により一周することができ、キャンプも可能である。数本の河川が流入、湖山川によって[[日本海]]と結ばれる。鳥取市郊外の行楽地の一つである。 20 21鳥取市三津地区では、全国的にも珍しい[[石がま漁]]が冬季に行われている。石の隙間に潜む魚を棒でつついて追い込み捕獲する漁法で、県指定無形民俗文化財に指定されている。地元自治会やNPOが保存に努めている。漁期間中には[[石がま祭]]も行われる。 22 23広大な水田を有していた長者が、日没までに田植えが終わらなかったため、扇子で夕日を招き返して田植えを終えたが、一夜明けると田は全て池に変わっていた、という「[[湖山長者]]」の伝説が知られる(似たような話が[[岐阜市]]の[[ゆうべが池]]に伝わっている)。古くから開けた地域であり、青島周辺には[[縄文時代]]から[[弥生時代]]にかけての[[遺跡]]がある。また[[戦国時代 (日本)|戦国時代]]には東側の湖畔に[[因幡国]]守護所である[[布勢天神山城]]がおかれ、西側の湖畔に突き出た半島には国人領主[[吉岡氏]]の居城である[[防己尾城]]が築かれた。 24 25 26#以下略

list_history_0.txt

1日本ゴルフツアー機構 2{{基礎情報 非営利団体 3|名称=日本ゴルフツアー機構&lt;br /&gt;''Japan Golf Tour Organization'' 4|ロゴ= 5|創立者= 6|団体種類=[[社団法人|一般社団法人]] 7|設立=[[2005年]][[7月28日]] 8|所在地= 9|起源= 10|主要人物=会長 [[海老沢勝二]] 11|活動地域={{JPN}} 12|製品= 13|主眼= 14|活動内容=プロ[[ゴルフ]]ツアーの主催 15|活動手段= 16|収入= 17|基本財産= 18|ボランティア人数= 19|従業員数= 20|会員数= 21|子団体= 22|標語= 23|ウェブサイト= http://www.jgto.org/ 24|解散= 25|特記事項= 26}} 27'''一般社団法人日本ゴルフツアー機構'''(にっほんゴルフツアーきこう、JGTO;''Japan Golf Tour Organization'')とは、[[1999年]]度から[[日本]]のプロ[[ゴルフ]]ツアーの試合について主催・主管を行っている組織である。 28 29== 概要 == 30シーズンは4月の「[[東建ホームメイトカップ]]」が新年度の最初の試合となり、12月まで25前後の試合を開催している。基本的には1大会4日間競技で開催している。なお、一部の大会では当ツアーと[[ワンアジアツアー]]が共同で主催する国外での大会があり、[[2014年]](2試合。&lt;ref&gt;日本開催・[[アジアンツアー]]共催の「ダイヤモンドカップ」を含むと3試合&lt;/ref&gt;)の実質的な当ツアーの[[開幕戦]]は「インドネシアPGA選手権」である&lt;ref&gt;[http://www.jgto.org/pc/OtherTopicsDetail.do?year=2014&amp;tournaKbnCd=0&amp;conferenceCd=000&amp;languageKbn=0&amp;administerNo=944 いよいよ2014年の初戦、インドネシアPGA選手権](日本ゴルフツアー機構。当初は[[タイランドオープン]]が実質的な開幕戦の予定だったが、[[タイ王国]]の政治的な内紛が起こっているという事情により延期となった)&lt;/ref&gt;。 31 32#中略 33 34{{デフォルトソート:にほんこるふつあきこう}} 35[[Category:日本ゴルフツアー|*]] 36[[Category:ゴルフに関する日本の組織|こるふつあきこう]] 37[[Category:一般社団法人 (スポーツ関係)]] 38[[Category:東京都港区の一般社団法人]] 39[[Category:2005年設立]] 40 41 42 43桂米朝 44[[画像:Musubi-kashiwa.svg|right|thumb|結び柏は、桂[[米朝一門]]の[[定紋]]である。]] 45'''桂 米朝'''(かつら べいちょう)は、[[上方落語]]の[[名跡]]。本来は、大名跡である[[桂米團治]]を継ぐ前段階の名跡。初代が入門した際、師匠の「米」と夫人の名前である「あさ」から「米朝」とつけたのが始まり。当代は3代目。 46 47 48 49

よろしくお願いします.

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

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

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

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

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

yuma.inaura

2022/12/30 00:55

expected string or bytes-like object でググってみましたか?
melian

2022/12/30 00:55

簡単には、 myfile = open('history_0text.txt').read() とします。(エラーチェックを入れる方がよいかと思いますが) おそらく、G = makeG(Gfile) でも同じエラーになるはずなので、同様の修正が必要です。
studyprg

2022/12/30 03:21

melianさんの方法で修正してみました. 以下エラーです. python3 Jtest.py historyテキストとGuideテキストを読み込みました Traceback (most recent call last): File "/Users/daru/python/kennkyu/Jtest.py", line 151, in <module> history = makeH(myfile) # 段落ごとに分9割された二次元リスト(str) File "/Users/****/Jtest.py", line 40, in makeH history[y]).splitlines() if "名詞" in line.split()[-1]] IndexError: list index out of range
studyprg

2022/12/30 03:23

Yuma.imamuraさん> 一応調べてはみましたが,理解できませんでしたので質問してます.
studyprg

2022/12/30 03:29

listの番号について調べましたが,同様のエラーで困ってます. 現在のソースです. 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 # -*- coding: utf-8 -*- from gensim.models import KeyedVectors import math import MeCab import sys import re # global m = MeCab.Tagger() # Ochasenで失敗したのでデフォルト myfile = open('history_0text.txt') # history Gfile = open('koyamaike.txt') # ガイド文書(koyamaike.txt) print("\n\nhistoryテキストとGuideテキストを読み込みました\n\n") removeW = re.compile( '[!"#$%&\'\\\\()*+,-./:;<=>?@[\\]^_`{|}~「」〔〕“”〈〉, ,『』【】&*・()$#@。、?!`+¥% ]') # def def makeG(guide): guide = removeW.sub('', guide) # 記号除去 for x in range(len(guide)): guide = [line.split()[0] for line in m.parse( guide[x]).splitlines() if "名詞" in line.split()[-1]] return guide def makeH(history): history = removeW.sub('', history) # 記号除去 history = history.split('\n\n\n\n') # 記事分割 for y in range(len(history)): history = [line.split()[0] for line in m.parse( history[y]).splitlines() if "名詞" in line.split()[-1]] return history def idfe(t, p): idf = 0 x = 0 for i in range(0, len(p)-1): if t in p: x += 1 if x == 0: x += 0.05 # beta idf = len(p)/x idf = math.log(idf) return idf def tfe(t, para): tf = 0 s = 0 for x in para: s += para.count(x) tf = para.count(t)/s return tf def idfe_2(t, H): idf2 = 0 x = 0 for i in range(0, len(H)-1): if t in H[i]: x += 1 if x == 0: x += 0.05 # beta idf2 = len(H)/x idf2 = math.log(idf2) return idf2 def Rexact(paragraf, history): R = 0 for t in paragraf: R += (tfe(t, paragraf)*idfe(t, paragraf)*idfe_2(t, history)) return R # main history = makeH(myfile) # 段落ごとに分9割された二次元リスト(str) G = makeG(Gfile) # 記事ごとに分割された二次元リスト for n in range(0, len(G)-1): Rdice = {} x = 0 y = 0 y = Rexact(G[n], history) Rdice.setdefault(n, y) print(n, "段落のtfidf:", y) Rsort_s = sorted(Rdics.items()) Rsort_e = sorted(Rdice.items()) print(Rsort_s) print(Rsort_e) print("ended") exit
studyprg

2022/12/30 03:30 編集

現在のエラーです. % python3 Jtest.py historyテキストとGuideテキストを読み込みました Traceback (most recent call last): File "/Users/****/Jtest.py", line 151, in <module> history = makeH(myfile) # 段落ごとに分割された二次元リスト(str) File "/Users/****/Jtest.py", line 40, in makeH history[y]).splitlines() if "名詞" in line.split()[-1]] IndexError: list index out of range
studyprg

2022/12/30 03:31

一応この質問はプログラムが動くようにして欲しいのでこのページで継続してます.
studyprg

2022/12/30 07:29

新しい質問ページ作ったのでmelianさん回答作成お願いします.
melian

2022/12/30 07:41

はい、回答に転記しました。
guest

回答1

0

ベストアンサー

※ コメントから転記

簡単には、

python

1myfile = open('history_0text.txt').read()

とします。(エラーチェックを入れる方がよいかと思いますが)
おそらく、G = makeG(Gfile) を実行する際にも同じエラーが発生するはずなので、同様の修正が必要です。

投稿2022/12/30 07:41

melian

総合スコア19754

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問