🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

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

Q&A

解決済

2回答

1046閲覧

Python リストから特定の文字を削除

Nomi515

総合スコア8

Python 3.x

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

0グッド

0クリップ

投稿2019/11/28 17:45

編集2019/11/29 12:36

現在、複数のJSONファイルになっている記事データからtext部分のみを取り出し、記事に含まれている全単語が何個の記事に出現するかを調べています。

Python

1articles = [] 2 wordset = set() # 出現単語セット 3 4 for line in fileinput.input(JSON_FILE): 5 wordcounter = Counter() 6 json_obj = json.loads(line) 7 json_obj1 = json_obj['text'] 8 for s in json_obj1: 9 tokens = t.tokenize(s) 10 base_forms = [tk.base_form for tk in tokens] 11 wordset.update(base_forms) 12 wordcounter.update(base_forms) 13 unique_arr = np.unique(base_forms) 14 l.append(unique_arr)

こちらはプログラムの一部になります。最初のfor文で、JSON_FILEから1記事毎読み取り、その中のTEXTのみ取り出します。

次のfor文で記事毎の単語を分解します。ここで、wordsetには全記事の単語、リストlには1記事文の単語が代入されています。

Python

1wordset = Counter(wordset) 2for W in l: 3 4 wordset.update(W) 5 6wordset_sorted = sorted(wordset.items(), key=lambda x:x[1]) 7 8print(wordset)

最後にwordsetとlを比較して、出現回数を調べています。

しかし、上記のプログラム

Python

1for s in json_obj1:

の部分で、sに代入されているデータが1記事毎のデータではなく、','で区切られた状態になってしまっていました。下記に出力結果の一部を示しています。

json_obj1をprintした一部↓

['コーエーテクモゲームスは、9月27日(Steam版は10月16日)に発売を予定しているプレイステーション 4/Nintendo Switch用タクティカルアクション「無双 OROCHI3」の最新情報を公開した。', '今回は、新キャラクター「ペルセウス」のキャラクター紹介動画が公開された。CVは下野 紘さんが務める。他にも、ストーリーのキーとなるキャラクターが特別な姿へ変化する「神格化」について、「関銀屏」が対象となることが明らかになった。さらに、神の力を得たキーアイテム「神器」2種が公開された。', 'オリュンポスの英雄。神であるゼウスと、人であるダナエーの間に生まれた半神。メドゥーサ殺しを成し遂げ、英雄として崇められるようになった。ゼウスによる人間界への介入を憂い、世界の混乱を防ぐために立ち上がる。', 'ストーリーのキーとなる8名は、神の力を身に宿した姿へ変化する「神格化」を遂げる。今回新たに「関銀屏(CV:三上枝織)」の神格化が決定した。', '大変器量が良く、護身術のつもりで習った武芸に才能を発揮する。とてつもない怪力だが、本人は気づいていない。', '守護神ヘルメスの持つ、翼の生えた魔法の靴。身につけた者は風を追い越す速度を得る。', '仙人が創り出した神秘の宝のひとつ。大地を揺るがし山を吹き飛ばす力を持つ。', '開催中の店頭体験会の追加日程が決定した。試遊した人には「『無双OROCHI3』特製缶バッジ」がランダム配布される。数には限りがあり、なくなり次第終了となる。', '【店頭体験会 追加日程】', '東京都池袋にある飲食店「KOEI TECMO CAFE & DINING」とのコラボレーションが9月上旬に開催される。「無双OROCHI3」にちなんだ店内装飾や、限定メニューが楽しめる。詳細な期間や予約方法などは後日公開される予定。', '©コーエーテクモゲームス All rights reserved.']

この状態でfor文を用いてsに代入すると

【店頭体験会 追加日程】 東京都池袋にある飲食店「KOEI TECMO CAFE & DINING」とのコラボレーションが9月上旬に開催される。「無双OROCHI3」にちなんだ店内装飾や、限定メニューが楽しめる。詳細な期間や予約方法などは後日公開される予定。 ©コーエーテクモゲームス All rights reserved.

~~のように','で区切られてしまいます。~~json_obj1の出力結果で、','で区切られている部分に分割されsに代入されてしまっています。

この状態では1記事毎で出現単語を調べることができません。**(現状では、1記事単位ではなく','で区切られた1文単位で出現単語を調べてしまっている)**どのように変更すればよろしいでしょうか?

strip関数を用いて、','を削除を試してみましたが、sに代入する時に1文字単位で分解されてしまいました。

追記
sの出力結果
sの問題点:上記のjson_obj1を出力した結果の','を区切りに読み込まれてしまっている。目的物としては、1記事単位で読み込んでほしい。上記の画像を例とすると、

コーエーテクモゲームスは、9月27日(Steam版は10月16日)に発売を予定しているプレイステーション 4/Nintendo Switch用タクティカルアクション「無双 OROCHI3」の最新情報を公開した。今回は、新キャラクター「ペルセウス」のキャラクター紹介動画が公開された。CVは下野 紘さんが務める。他にも、ストーリーのキーとなるキャラクターが特別な姿へ変化する「神格化」について、「関銀屏」が対象となることが明らかになった。さらに、神の力を得たキーアイテム「神器」2種が公開された。オリュンポスの英雄。神であるゼウスと、人であるダナエーの間に生まれた半神。メドゥーサ殺しを成し遂げ、英雄として崇められるようになった。ゼウスによる人間界への介入を憂い、世界の混乱を防ぐために立ち上がる。ストーリーのキーとなる8名は、神の力を身に宿した姿へ変化する「神格化」を遂げる。今回新たに「関銀屏(CV:三上枝織)」の神格化が決定した。大変器量が良く、護身術のつもりで習った武芸に才能を発揮する。とてつもない怪力だが、本人は気づいていない。"守護神ヘルメスの持つ、翼の生えた魔法の靴。身につけた者は風を追い越す速度を得る。仙人が創り出した神秘の宝のひとつ。大地を揺るがし山を吹き飛ばす力を持つ。"開催中の店頭体験会の追加日程が決定した。試遊した人には「『無双OROCHI3』特製缶バッジ」がランダム配布される。数には限りがあり、なくなり次第終了となる。【店頭体験会 追加日程】東京都池袋にある飲食店「KOEI TECMO CAFE & DINING」とのコラボレーションが9月上旬に開催される。「無双OROCHI3」にちなんだ店内装飾や、限定メニューが楽しめる。詳細な期間や予約方法などは後日公開される予定。©コーエーテクモゲームス All rights reserved.

このように表示されることを目指しています。

こちらは、現段階のプログラムの出力結果です。
wordsetの出力結果
記事数は710記事のため、それを超えてカウントされているものが多々あるためこのような結果となっていると推測し、調べていると、最初の質問のとおり s にはいっている文字列が1記事単位となっていないため、上記のような数値が表示されているのではないかという考えに至りました。

以上で補足とさせていただきます。また、回答するにあたって不明な点などがございましたら連絡いただけると幸いです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

リストはカンマで区切られているものです。
カンマを無くしたいというのは要素を結合したいという意味であっていますか?
文字列のリストを一つの文字列にしたいのであれば join すればいいです。

python

1>>> json_obj1 = ['Hello', 'World', '!'] 2>>> ''.join(json_obj1) 3'HelloWorld!' 4>>> ' '.join(json_obj1) 5'Hello World !'

1要素のリストにしたいのであれば角括弧で囲みます。。

python

1>>> [' '.join(json_obj1)] 2['Hello World !']

結合した結果は変数に再代入してください。

python

1json_obj1 = [' '.join(json_obj1)]

そうした場合、直後のfor文は常に1回しかループしないので、リストにするのをやめて、ループを無くすことができます。

python

1json_obj1 = ' '.join(json_obj['text']) 2tokens = t.tokenize(json_obj1) 3base_forms = [tk.base_form for tk in tokens] 4wordset.update(base_forms) 5wordcounter.update(base_forms) 6unique_arr = np.unique(base_forms) 7l.append(unique_arr)

投稿2019/11/29 10:17

編集2019/11/30 00:59
shiracamus

総合スコア5406

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

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

Nomi515

2019/11/29 12:32

joinも試してみたのですが、json_obj1をjoinすると、sに代入する際に1文字単位で区切られてしまい目的の結果が得られませんでした。
shiracamus

2019/11/29 12:47 編集

何が必要なのでしょう? 単語に分けたいのであれば ' '.join(data).split() にすれば単語単位のリストになります。 文字列一個のリストにしたいなら [' '.join(data)] でいいです。
Nomi515

2019/11/29 12:56 編集

最終的な目的としては、質問に追記したとおりに1記事毎の出現単語を調べ、1単語が何記事に出現したかを出力する辞書オブジェクトを作成します。 しかし、現状では1記事毎の単語ではなく、1記事が','で区切られた1文ずつに分解されてしまっています。そしてその中から出現単語を調べ上げることになっているので想定している回数より多くカウントされてしまっています。 なので、欲しいものとしては、全記事(710記事)を1記事単位に分割したリストです。
shiracamus

2019/11/29 13:30

> 1記事が','で区切られた1文ずつに分解されてしまっています。 1文ずつに分解されてリストになった文字列があるのですよね? まずは、それをどういうデータに変換したいですか? 3文がカンマに区切られたリストになっているのであれば data = ' '.join(["1文目", "2文目", "3文目"]) とすれば "1文目 2文目 3文目” という一つの文字列になって変数 data に代入されます。
Nomi515

2019/11/29 15:34

1記事ずつのデータ(json_obj1)を文字列のデータに変換したいです。
shiracamus

2019/11/30 01:14 編集

json_obj1 = json_obj['text'] を json_obj1 = [' '.join(json_obj['text'])] にすれば1記事のリストになります。 そうした場合、直後のfor文は常に1回しかループしないので、ループを無くすことができます。 そうしたコードを回答欄に追記しました。
Nomi515

2019/11/30 03:47

無事解決致しました!!有難うございました。
guest

0

sは文字列ではなく純然たるlistです。段落ごとに文章を格納したリストとか、そんな感じで取れてるんでしょう。
(これはヤマカンで書いているので、どうなっているのかはご自身でちゃんと確認してください)

内包表記を使って

python

1tokens = [w for x in s for w in t.tokenize(x)]

とでもしてみては。

投稿2019/11/28 17:50

編集2019/11/28 17:51
hayataka2049

総合スコア30935

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

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

Nomi515

2019/11/29 02:54

回答有難うございます。申し訳ないのですが、回答のプログラムをどのように組み込むと宜しいのでしょうか?
hayataka2049

2019/11/29 03:01

tokens = t.tokenize(s) のかわりにいれる
Nomi515

2019/11/29 04:58

ありがとうございます。 しかし、1文字毎に文章が分解されるようになってしまいました。
hayataka2049

2019/11/29 06:50

すみません、ちょっと勘違いしてました。修正しますのでしばしお待ちください。
Nomi515

2019/11/29 07:40

承知しました。
hayataka2049

2019/11/29 10:10

なんとか修正しようと思って質問文を改めて読み直してみたのですが、どうしても腑に落ちない点(私が早とちりして勘違いした点でもある)があります。 json_obj1をprintした結果が質問文のようなのであれば、sには各段落の文字列が問題なく入るはずです。 (「json_obj1をprintした一部↓」に関して) また、「この状態でfor文を用いてsに代入すると」の部分で結果がカンマで区切られているようには見えないので、そもそもの問題意識のすりあわせが上手く行っていないと思います。現状だと、何がしたくて、何が思い通りいっていないのか、私は把握できていないです。 恐縮ですが、先に質問文を編集してもう少し詳しく書いてみていただけませんか?
Nomi515

2019/11/29 12:30

質問文に追記させていただきました。 (「この状態でfor文を用いてsに代入すると」の部分で結果がカンマで区切られているようには見えないので、そもそもの問題意識のすりあわせが上手く行っていないと思います。) に関してですが、json_obj1の出力結果で、','で区切られた部分が一つずつsに代入されているという意味です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問