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

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

ただいまの
回答率

90.23%

独自のstop wordテキストの適応について。

解決済

回答 1

投稿

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

1mzmk

score 16

以前、この質問に関する質問をさせていただきましたが、質問の仕方を変えた方がよいと感じ、新しく質問させてください。

私は、あるjsonファイルを使用しています。
私のjsonファイルは、下のURLのjsonファイルでワインについてのレビューについてのデータで、多くの種類のワインのレビューについてリストとして記載されています。
'https://github.com/tulip-lab/sit742/raw/master/Assessment/2019/data/wine.json'

行には”country”,"variety", "price", "point", "description"などの項目があります。
私のjsonファイルは下のような表になります。(1行が1レビューになってます。)
イメージ説明
私は、このファイルの"description"の列で5000件以上のレビューに現れるユニグラムを求めることを目的としています。
また、ストップワードとして'stopwords.txt'に記載された単語を”description”から省いた状態でもとめなければなりません。
下のURLが'stopwords.txt'となっています。
'https://github.com/tulip-lab/sit742/raw/master/Assessment/2019/data/stopwords.txt'

以下が"description"の列で5000件以上のレビューに現れるユニグラムを求めるためのコードのテンプレートとなっています。

import re
import nltk
from nltk.tokenize import RegexpTokenizer
from nltk.probability import *
from itertools import chain
#from tqdm import tqdm
import codecs
with open('stopwords.txt') as f:
    stop_words = f.read().splitlines()
stop_words = set(stop_words)
# write your code here
# define your tokenize

tokenizer = RegexpTokenizer(r"\w+(?:[-']\w+)?")
# find top common words with document frequencies > 5000
# you may use function FreqDist() and sort()
# save your table to 'top_common_words.txt'

そして、下のコードが私が書いたコードです。

!pip install wget
import wget

link_to_data = 'https://github.com/tulip-lab/sit742/raw/master/Assessment/2019/data/wine.json'
DataSet = wget.download(link_to_data)

link_to_data = 'https://github.com/tulip-lab/sit742/raw/master/Assessment/2019/data/stopwords.txt'

DataSet = wget.download(link_to_data)
!ls
import json
import pandas as pd
import matplotlib.pyplot as plt
file = 'wine.json'
df = pd.read_json("wine.json")
import re
import nltk
from nltk.tokenize import RegexpTokenizer
from nltk.probability import *
from itertools import chain

import codecs
with open('stopwords.txt') as f:
    stop_words = f.read().splitlines()
stop_words = set(stop_words)
tokenizer = RegexpTokenizer(r"\w+(?:[-']\w+)?")


ファイルの"description"の列で5000件以上のレビューに現れるユニグラムを求めたい場合、私は自分が書いたコードの次にテンプレート通りに FreqDist()とsort()を使用すれば、そのまま"description"の列で5000件以上のレビューに現れるユニグラムを求めることができるのでしょうか。
それとも、 FreqDist()とsort()を使用する前にストップワードの記載された'stopwords.txt'を新たに”description”適応したりするためにほかにコードを書く必要があるのでしょうか。もしくは、そのほかにも何か書くべきコードがありましたら教えて頂けますでしょうか。

つまり、下に書いたテンプレートの部分でそれ以前に余分に書くべきコードが私の書いたコードと比較して何かある場合は教えて頂けますでしょうか。

# find top common words with document frequencies > 5000
# you may use function FreqDist() and sort()

お願いいたします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • Lhankor_Mhy

    2019/04/03 09:26

    『私は自分が書いたコードの次にテンプレート通りに FreqDist()とsort()を使用すれば、そのまま"description"の列で5000件以上のレビューに現れるユニグラムを求めることができるのでしょうか。』とありますが、試しに実行してみる、という方法では判別できないのですか?

    また、実行しても「求める」ことができたかどうか判別しない場合、回答者はなにをもって「求める」ことができるということを示せばよいですか?

    キャンセル

  • 1mzmk

    2019/04/03 16:10

    すいません、単に FreqDist()とsort()を使用する以前にストップワードをjsonファイルから省きたくて、
    その方法をお聞きしたかっただけです。
    説明がややこしくなって、すいませんでした。

    キャンセル

回答 1

checkベストアンサー

+1

「ストップワードを除去」だけなら、以下のようにすれば良いのでは。空白区切りの文字列に変換してjsonに書き戻していますが、この辺をどう処理するかは任意です(私がやるなら文字列の配列にでもします)。

import pandas as pd
from nltk.tokenize import RegexpTokenizer

df = pd.read_json("wine.json")
with open('stopwords.txt') as f:
    stop_words = f.read().splitlines()
stop_words = set(stop_words)

tokenizer = RegexpTokenizer(r"\w+(?:[-']\w+)?")

def f(s):
    tokens = tokenizer.tokenize(s)
    return " ".join(word for word in tokens if word not in stop_words)

df["description"] = df["description"].map(f)
df.to_json("result.json")

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/04/03 19:12

    下のコードのようにしてあるテキストファイルをFreqDisc()を用いてbigramを求めているサイトを見つけましたので、私のファイルはjsonファイルですが、そのようにしてtokens_lを定義して”result.json”の”discription”の列だけのユニグラムの頻度求めることができるのではないかと考えました。
    URL:'http://yoshihikomuto.hatenablog.jp/entry/2012/12/18/043725'

    (コード)  
    import nltk
    >>> f = open('obama_inaugural_transcript.txt')
    >>> raw = f.read()
    >>> tokens = nltk.word_tokenize(raw) #テキストをトークンに分割

    >>> raw #元のテキスト
    'I stand here today humbled by the task before us, grateful for the trust you've bestowed, mindful of the sacrifices borne by our ancestors.\n\n I thank President Bush for his service to our nation ............................

    >>> tokens #トークンへの分割後
    ['I','stand','here','today','humbled','by','the','task','before','us',',','grateful','for','the','trust','you',"'ve",'bestowed',',','mindful','of','the','sacrifices','borne','by','our','ancestors','.','I','thank','President','Bush','for','his','service','to','our','nation',
    ............................

    >>> len(tokens) #単語数(ただし,大文字・小文字を区別している)
    2648
    >>> len(set(tokens)) #異なり語数(ただし,大文字・小文字を区別している)
    974

    tokens_l = [w.lower() for w in tokens]
    >>> len(set(tokens_l))
    938

    #単語の出現頻度分布(Frequency Distribution)
    >>> fd = nltk.FreqDist(tokens_l)

    #頻度分布のプロット(上位50件)
    >>> fd.plot(50)

    #バイグラムを作る。
    >>> bigrams = nltk.bigrams(tokens_l)

    #バイグラムの頻度分布を得る。
    >>> fd = nltk.FreqDist(bigrams)





    よろしくお願いします。

    キャンセル

  • 2019/04/04 19:22

    憶測混じりですが、description列のデータすべてをこの回答のような方法でリストにしてストップワード除去し、結果を結合すればそのコードで使っているtokens_lと同様に使えると思います。

    キャンセル

  • 2019/04/05 03:28

    このコードにならって、df7 = df['description']として、 ”description”の単語をトークンに分割するために
    tokens = nltk.word_tokenize(df7)
    とするとエラーになってしまい、
    tokens を定義することができないのですが、
    どのようにtokensを定義すればよいでしょうか。

    キャンセル

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

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

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