web-dev-qa-db-ja.com

データフレームでWord_tokenizeを使用する方法

最近、テキスト分析にnltkモジュールの使用を開始しました。私はある時点で立ち往生しています。データフレームの特定の行で使用されているすべての単語を取得するために、データフレームでWord_tokenizeを使用します。

data example:
       text
1.   This is a very good site. I will recommend it to others.
2.   Can you please give me a call at 9983938428. have issues with the listings.
3.   good work! keep it up
4.   not a very helpful site in finding home decor. 

expected output:

1.   'This','is','a','very','good','site','.','I','will','recommend','it','to','others','.'
2.   'Can','you','please','give','me','a','call','at','9983938428','.','have','issues','with','the','listings'
3.   'good','work','!','keep','it','up'
4.   'not','a','very','helpful','site','in','finding','home','decor'

基本的に、すべての単語を分離し、データフレーム内の各テキストの長さを見つけたいです。

Word_tokenizeが文字列に使用できることは知っていますが、データフレーム全体に適用する方法は?

助けてください!

前もって感謝します...

10
eclairs

DataFrame APIのapplyメソッドを使用できます。

import pandas as pd
import nltk

df = pd.DataFrame({'sentences': ['This is a very good site. I will recommend it to others.', 'Can you please give me a call at 9983938428. have issues with the listings.', 'good work! keep it up']})
df['tokenized_sents'] = df.apply(lambda row: nltk.Word_tokenize(row['sentences']), axis=1)

出力:

>>> df
                                           sentences  \
0  This is a very good site. I will recommend it ...   
1  Can you please give me a call at 9983938428. h...   
2                              good work! keep it up   

                                     tokenized_sents  
0  [This, is, a, very, good, site, ., I, will, re...  
1  [Can, you, please, give, me, a, call, at, 9983...  
2                      [good, work, !, keep, it, up]

各テキストの長さを見つけるには、再度applylambda functionを使用してみてください:

df['sents_length'] = df.apply(lambda row: len(row['tokenized_sents']), axis=1)

>>> df
                                           sentences  \
0  This is a very good site. I will recommend it ...   
1  Can you please give me a call at 9983938428. h...   
2                              good work! keep it up   

                                     tokenized_sents  sents_length  
0  [This, is, a, very, good, site, ., I, will, re...            14  
1  [Can, you, please, give, me, a, call, at, 9983...            15  
2                      [good, work, !, keep, it, up]             6  
19
Gregg

pandas.Series.applyはpandas.DataFrame.applyよりも高速です

import pandas as pd
import nltk

df = pd.read_csv("/path/to/file.csv")

start = time.time()
df["unigrams"] = df["verbatim"].apply(nltk.Word_tokenize)
print "series.apply", (time.time() - start)

start = time.time()
df["unigrams2"] = df.apply(lambda row: nltk.Word_tokenize(row["verbatim"]), axis=1)
print "dataframe.apply", (time.time() - start)

サンプルの125 MB csvファイルでは、

series.apply 144.428858995

dataframe.apply 201.884778976

編集:データフレームを考えているかもしれませんdfseries.apply(nltk.Word_tokenize)はサイズが大きく、ランタイムに影響する可能性があります次の操作dataframe.apply(nltk.Word_tokenize)

パンダは、このようなシナリオのために内部で最適化を行います。 dataframe.apply(nltk.Word_tokenize)を個別に実行するだけで、同様のランタイム200sを取得しました。

18

パンダのオブジェクトタイプを文字列に変換するには、str()を追加する必要がある場合があります。

単語をカウントするより高速な方法は、スペースをカウントすることです。

興味深いことに、トークナイザーは期間をカウントします。最初にそれらを削除したい場合があります。また、数字を削除することもできます。下の行のコメントを外すと、少なくともこの場合は等しい数になります。

import nltk
import pandas as pd

sentences = pd.Series([ 
    'This is a very good site. I will recommend it to others.',
    'Can you please give me a call at 9983938428. have issues with the listings.',
    'good work! keep it up',
    'not a very helpful site in finding home decor. '
])

# remove anything but characters and spaces
sentences = sentences.str.replace('[^A-z ]','').str.replace(' +',' ').str.strip()

splitwords = [ nltk.Word_tokenize( str(sentence) ) for sentence in sentences ]
print(splitwords)
    # output: [['This', 'is', 'a', 'very', 'good', 'site', 'I', 'will', 'recommend', 'it', 'to', 'others'], ['Can', 'you', 'please', 'give', 'me', 'a', 'call', 'at', 'have', 'issues', 'with', 'the', 'listings'], ['good', 'work', 'keep', 'it', 'up'], ['not', 'a', 'very', 'helpful', 'site', 'in', 'finding', 'home', 'decor']]

wordcounts = [ len(words) for words in splitwords ]
print(wordcounts)
    # output: [12, 13, 5, 9]

wordcounts2 = [ sentence.count(' ') + 1 for sentence in sentences ]
print(wordcounts2)
    # output: [12, 13, 5, 9]

Pandasを使用していない場合、str()は必要ないかもしれません

0