gpt4 book ai didi

python - 从 pandas DataFrame 创建术语密度矩阵的有效方法

转载 作者:太空狗 更新时间:2023-10-29 21:16:43 24 4
gpt4 key购买 nike

我正在尝试从 Pandas 数据框中创建词条密度矩阵,以便我可以对出现在数据框中的词条进行评分。我还希望能够保留我的数据的“空间”方面(有关我的意思的示例,请参阅帖子末尾的评论)。

我是 pandas 和 NLTK 的新手,所以我希望我的问题可以通过一些现有工具解决。

我有一个包含两列感兴趣的数据框:说“标题”和“页面”

    import pandas as pd
import re

df = pd.DataFrame({'title':['Delicious boiled egg','Fried egg ','Split orange','Something else'], 'page':[1, 2, 3, 4]})
df.head()

page title
0 1 Delicious boiled egg
1 2 Fried egg
2 3 Split orange
3 4 Something else

我的目标是清理文本,并将感兴趣的术语传递给 TDM 数据框。我使用两个函数来帮助我清理字符串

    import nltk.classify
from nltk.tokenize import wordpunct_tokenize
from nltk.corpus import stopwords
import string

def remove_punct(strin):
'''
returns a string with the punctuation marks removed, and all lower case letters
input: strin, an ascii string. convert using strin.encode('ascii','ignore') if it is unicode
'''
return strin.translate(string.maketrans("",""), string.punctuation).lower()

sw = stopwords.words('english')

def tok_cln(strin):
'''
tokenizes string and removes stopwords
'''
return set(nltk.wordpunct_tokenize(strin)).difference(sw)

还有一个操作数据帧的函数

    def df2tdm(df,titleColumn,placementColumn,newPlacementColumn):
'''
takes in a DataFrame with at least two columns, and returns a dataframe with the term density matrix
of the words appearing in the titleColumn
Inputs: df, a DataFrame containing titleColumn, placementColumn among others
Outputs: tdm_df, a DataFrame containing newPlacementColumn and columns with all the terms in df[titleColumn]
'''
tdm_df = pd.DataFrame(index=df.index, columns=[newPlacementColumn])
tdm_df = tdm_df.fillna(0)
for idx in df.index:
for word in tok_cln( remove_punct(df[titleColumn][idx].encode('ascii','ignore')) ):
if word not in tdm_df.columns:
newcol = pd.DataFrame(index = df.index, columns = [word])
tdm_df = tdm_df.join(newcol)
tdm_df[newPlacementColumn][idx] = df[placementColumn][idx]
tdm_df[word][idx] = 1
return tdm_df.fillna(0,inplace = False)

tdm_df = df2tdm(df,'title','page','pub_page')
tdm_df.head()

返回

      pub_page boiled egg delicious fried orange split something else
0 1 1 1 1 0 0 0 0 0
1 2 0 1 0 1 0 0 0 0
2 3 0 0 0 0 1 1 0 0
3 4 0 0 0 0 0 0 1 1

但是在解析大型集合(数十万行,数千列的输出)时,它的速度非常慢。我的两个问题:

我可以加快这个实现吗?

我可以使用其他工具来完成这项工作吗?

我希望能够保留我的数据的“空间”方面,例如,如果“鸡蛋”经常出现在第 1-10 页,然后又经常出现在第 500-520 页,我想知道这一点。

最佳答案

您可以使用 scikit-learn 的 CountVectorizer :

In [14]: from sklearn.feature_extraction.text import CountVectorizer

In [15]: countvec = CountVectorizer()

In [16]: countvec.fit_transform(df.title)
Out[16]:
<4x8 sparse matrix of type '<type 'numpy.int64'>'
with 9 stored elements in Compressed Sparse Column format>

它以稀疏表示形式返回术语文档矩阵,因为这种矩阵通常很大,而且很稀疏。

对于您的特定示例,我想将其转换回 DataFrame 仍然有效:

In [17]: pd.DataFrame(countvec.fit_transform(df.title).toarray(), columns=countvec.get_feature_names())
Out[17]:
boiled delicious egg else fried orange something split
0 1 1 1 0 0 0 0 0
1 0 0 1 0 1 0 0 0
2 0 0 0 0 0 1 0 1
3 0 0 0 1 0 0 1 0

[4 rows x 8 columns]

关于python - 从 pandas DataFrame 创建术语密度矩阵的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22205845/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com