我正在尝试从Pandas数据帧中创建一个术语密度矩阵,以便评估数据帧中出现的术语。我还想能够保留我的数据的“空间”方面(请参见帖子结尾处的评论,了解我的意思举例)。
我对Pandas和NLTK都不熟悉,因此我认为可以使用某些现有工具来解决我的问题。
我有一个包含两个感兴趣的列的数据帧:称之为“标题”和“页面”。
我对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
但是,当解析大量数据集(数十万行,数千列的输出)时,速度非常缓慢。我的两个问题:
我能加速这个实现吗?
有没有其他工具可以使用来完成这项工作?
我希望能够保留数据的“空间”方面,例如如果“egg”在1-10页中经常出现,然后在500-520页中再次频繁出现,我想知道这一点。