Jas*_*all 2 python parsing nlp pandas
我试图从Pandas系列中的每个标量值中删除少于4个字符的所有单词.最好的方法是什么?这是我失败的尝试:
df['text'] = df['text'].str.join(word for word in df['text'].str.split() if len(word)>3)
Run Code Online (Sandbox Code Playgroud)
我收到以下错误消息:
AttributeError:'generator'对象没有属性'join'
我基于字符串中的相同内容尝试关闭此帖子:使用Python删除小词
附注:如果在删除少于4个字符之前更好地标记我的单词,请告诉我.
编辑:每个标量值包含句子,因此我想删除值中小于4的任何单词.
你可以这样做:
>>> df = pd.DataFrame({'text':["The quick brown fox", "jumped over the lazy dog"]})
>>> df
text
0 The quick brown fox
1 jumped over the lazy dog
>>> df['text'].str.split().map(lambda sl: " ".join(s for s in sl if len(s) > 3))
0 quick brown
1 jumped over lazy
Name: text, dtype: object
Run Code Online (Sandbox Code Playgroud)
但老实说,我通常坚持使用vanilla python进行文本处理管道.pandas数据结构与文本不兼容.最起码,你失去的记忆/速度优势numpy/ pandas.
将regex与.str.findall和.str.join一起使用似乎最快:
df['text'].str.findall('\w{4,}').str.join(' ')
Run Code Online (Sandbox Code Playgroud)
时机
使用以下设置:
df = pd.DataFrame({'text':["The quick brown fox", "jumped over the lazy dog", "foo bar baz", 'words exceeding desired length']})
df = pd.concat([df]*10**4, ignore_index=True)
def pir2(df):
t = df.text.str.split(expand=True).stack()
return t.loc[t.str.len() >= 4].groupby(level=0).apply(' '.join)
Run Code Online (Sandbox Code Playgroud)
我得到以下计时:
%timeit df['text'].str.findall('\w{4,}').str.join(' ')
10 loops, best of 3: 44.8 ms per loop
%timeit df.text.apply(lambda i: ' '.join(filter(lambda j: len(j) > 3, i.split())))
10 loops, best of 3: 79.3 ms per loop
%timeit df['text'].str.split().map(lambda sl: " ".join(s for s in sl if len(s) > 3))
10 loops, best of 3: 87.2 ms per loop
%timeit pir2(df)
1 loop, best of 3: 2.87 s per loop
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3563 次 |
| 最近记录: |