我想改造这个系列
from nltk import word_tokenize, pos_tag
from nltk.corpus import stopwords
stop_words = set(stopwords.words("english"))
df = pd.Series([["comic of book", "horror of movie"], ["dark", "dark french"]])
>> 0 [comic of book, horror of movie]
>> 1 [dark, dark french]
通过删除stopwords
并仅保留名词(NN
中的nltk
)。我认为apply
函数是最好的解决方案,但是直接将其应用于这些文本会导致信息丢失。我明白了
df.apply(lambda x: [wrd for ing in x for wrd in word_tokenize(ing) if wrd not in stop_words])
0 [comic, book, horror, movie]
1 [dark, dark, french]
代替
0 [comic book, horror movie]
1 [dark, dark french]
我错过了for loop
中的某些内容,并且将每个bag of words
分隔为唯一的words
(也许apply
在这里不好)
答案 0 :(得分:1)
def rmsw(y):
return ' '.join(set(y.split()) - stop_words)
pd.Series([[rmsw(y) for y in x] for x in df], df.index)
0 [comic book, horror movie]
1 [dark, dark french]
dtype: object
保持秩序和频率
def rmsw(y):
return ' '.join([w for w in y.split() if w not in stop_words])
pd.Series([[rmsw(y) for y in x] for x in df], df.index)
答案 1 :(得分:1)
如果性能比优雅更重要,则经典算法可以解决问题。
以下代码永远不会赢得选美比赛,但是(在我的ThinkPad上)性能比公认的列表理解方法高出约350-400%。差距将随着数据集的大小而增加,因为它正在处理更原始的数据类型(列表),并最终转换回熊猫。
temp_list = list()
for serie in df:
elements = list()
for element in serie:
for word in element.split():
if word in stop_words:
element = element.replace(f' {word} ', ' ')
elements.append(element)
temp_list.append(elements)
df = pd.Series(temp_list)
print(df)
选择取决于您:)