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

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

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

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

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

Q&A

1回答

659閲覧

(NLP前処理) 指定した単語を"others"として、よりスピーディーにエンコーディングしたい

shin_shin

総合スコア96

Python 3.x

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

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

0グッド

0クリップ

投稿2020/11/16 05:13

掲題の通り、指定した単語(UNWANTED_WORDS -> List)を、"others"として、エンコーディングしたいと思っています。イメージは、下記のような感じです。
例えば、"I like hogehoge"というツイートがあるとして、指定した単語リスト(UNWANTED_WORDS)の中に、"hogehoge"があるとすると、エンコーディング後に、"I like others"、となるような処理です。

現時点では、下記のようなナイーブな、for文の処理しか思いつかず、160万のツイートを処理するには、時間が掛かり過ぎると思っています。

GPUなど使わず、純粋に、pythonの書き方を改善するとすれば、どんな処理をすればよいでしょうか?
できれば、コードと共に、ご教示頂けると幸いでございます。

[コードの解説]
1.複数のツイートが入った変数"tweets"を、for文で回す
2.各ツイートに、UNWANTED_WORDSの単語が含まれているかの判定
3.もし、含まれていたら、その単語をothersに変換

python

1new_tweets = [] 2# Step1: 複数のツイートが入った変数"tweets"を、for文で回す 3for each_tweet in tweets: 4 #Step2: 各ツイートに、UNWANTED_WORDSの単語が含まれていたら、その単語を'others'として、エンコーディングする 5 encoded_aTweet = ' ' 6 if any(unwanted_word in each_tweet for unwanted_word in UNWANTED_WORDS): # ツイートにUNWANTED_WORDSの単語があるかの判定 7 # もし、あれば、ツイートの各単語をUNWANTED_WORDSと照らし合わせる 8 for each_word in each_tweet.split(): 9 if each_word in UNWANTED_WORDS: 10 each_word = "others" 11 encoded_aTweet += (each_word+' ') 12 new_tweets.append(encoded_aTweet) 13 else: 14 new_tweets.append(each_tweet)

どうぞ、よろしくお願いしたします。

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

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

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

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

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

guest

回答1

0

tweetということなので、1つのツイートに含まれる単語数は少なめで、UNWANTED_WORDSのサイズがそれなりに大きいと仮定しています。大きくない場合、これ以上の高速化はあまり期待できない気がします(処理のほとんどが160万回のループによるものだと思うので)。
全ツイートを処理するためには160万回ループすることは避けられないので、それ以外のところで高速化できそうなところを考えてみました。

  1. UNWANTED_WORDSをset型に変換する前処理を入れることで、each_word in UNWANTED_WORDS を早くする。UNWANTED_WORDSのサイズが大きいほど効果があるはず。
  2. 1.の変更を加えると、any(unwanted_word in each_tweet for unwanted_word in UNWANTED_WORDS) の部分をやめたほうが早いかもしれない……?(データによります)
  3. str.joinを使って文字列構築回数を減らす。

Python

1new_tweets = [] 2UNWANTED_WORDS = set(UNWANTED_WORDS) # <- listに対するinはO(n)だが、setに対するinはO(1) 3 4# Step1: 複数のツイートが入った変数"tweets"を、for文で回す 5for each_tweet in tweets: 6 #Step2: 各ツイートに、UNWANTED_WORDSの単語が含まれていたら、その単語を'others'として、エンコーディングする 7 encoded_aTweet = [] # <- 文字列を構築する回数を減らすと早くなる 8 if any(unwanted_word in each_tweet for unwanted_word in UNWANTED_WORDS): # ツイートにUNWANTED_WORDSの単語があるかの判定 9 # もし、あれば、ツイートの各単語をUNWANTED_WORDSと照らし合わせる 10 for each_word in each_tweet.split(): 11 if each_word in UNWANTED_WORDS: 12 each_word = "others" 13 encoded_aTweet.append(each_word) # <- 毎回文字列を構築しないようにする 14 new_tweets.append(' '.join(encoded_aTweet)) # <- ここでlistから文字列を構築 15 else: 16 new_tweets.append(each_tweet)

もしUNWANTED_WORDSが少なくて、これ以上の高速化を望むなら、Python以外で処理することを考えた方がいいと思います。例えば、LinuxのgrepコマンドでUNWANTED_WORDSが含まれている行(1ツイート1行の形式とします)と含まれていない行に分けて、含まれている行に対してだけPythonプログラムで処理をして、含まれていない行をcatでくっつける、とかです。

実行してみれば、160万ツイートなんてそのうち終わるような気もします。

投稿2020/11/18 05:23

mayac

総合スコア23

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問