微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

消除出现在 x% 数据框中的单词

如何解决消除出现在 x% 数据框中的单词

我有一个包含数千行的 pd 数据框。每行包含标记为 text_processed 的列,其中包含文本。这些文本可能很长,每行/文本数百个单词。现在我想消除出现在 95% 行中的单词。我正在做的是将所有文本加入一个大字符串并标记该字符串。我现在拥有所有文本中所有单词的词汇表。我现在想获取每个单词所在的行数。一种简单(且缓慢)的方法是遍历每个单词并比较该单词是否存在于列中,然后对结果求和以获得该单词所在的行数. 这可以在这里看到:

wordcountPerRow = []
for word in all_words:
    if word in [':','•','and','%','\\','|','-','no','of',')','(','[',']','--','/','*',';','`','``','\'\'','+']:
        continue
    try:
        wordcountPerRow.append([word,df_note['text_processed'].str.contains(r''+word).sum()])
    except:
        print(word)

一旦我获得了所有的总和,我将只执行 len(df)*0.95 并查看单词的行数是否 >= 95%,如果为真则消除该单词(布尔列)。这个过程看起来很慢,而且计算成本很高。有什么办法可以加快速度吗?我可以使用计数向量化器吗?

与此类似:removing words that appear more than x% in a corpus Python

解决方法

你试过 pd.str() 吗???

我们不知道你的字符串是什么样子,但由于它的 df 我可以假设你可以应用这个函数“切片”字符串。

你想保留你可以使用的左起前 10 个字母:

left = df['Your column'].str[:10]

你想保留你可以使用的前10个字母:

right = df['Your column'].str[-10:]

只是一个例子,可以成为解决您问题的良好开端

,

看起来您可以稍微改变一下使用计数向量化器。扭曲的是,因为 countvectorizer 计算每个文档的出现次数,我们可以简单地应用 bool 掩码(count_vector > 0),如果它在文档中出现 1 次或多次,它将掩码为 1,如果为 0,则为 0 和它对总和没有贡献。从这里我们可以转置,将索引作为特征名称,然后简单地选择我们想要的百分比区间。

from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer(df_note['text_processed'].tolist())#,max_df=0.8,min_df=0.1)#this eliminates words in top 0.8
count_vector=cv.fit_transform(df_note['text_processed'].tolist())

#number of documents a word occurs in
word_document_count = pd.DataFrame(np.array(np.sum(count_vector > 0,axis=0)).transpose() \,index=cv.get_feature_names(),columns=['Document Count'])

top_perc_num = len(df_note)*0.8
bottom_perc_num = len(df_note)*0.2
word_document_count_trunc = word_document_count[(word_document_count['Document Count'] < top_perc_num) & (word_document_count['Document Count'] > bottom_perc_num)]

我相信这是完成任务的更快方法。我唯一的抱怨是数字似乎与原始方法略有不同。我尝试了一个可重现的小例子,但结果是一样的。

这适用于 200k+ 单词和 90k+ 行

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。