文本分析:使用python查找列中最常用的单词

文本分析:使用python查找列中最常用的单词,python,pandas,Python,Pandas,我创建了一个dataframe,其中只有一列带有主题行 df = activities.filter(['Subject'],axis=1) df.shape 此操作返回此数据帧: Subject 0 Call Out: Quadria Capital - May Lo, VP 1 Call Out: Revelstoke - Anthony Hayes (Sr Assoc... 2 Columbia Partners: WW Worked (Not Sure Will E

我创建了一个dataframe,其中只有一列带有主题行

df = activities.filter(['Subject'],axis=1)
df.shape
此操作返回此数据帧:

    Subject
0   Call Out: Quadria Capital - May Lo, VP
1   Call Out: Revelstoke - Anthony Hayes (Sr Assoc...
2   Columbia Partners: WW Worked (Not Sure Will Ev...
3   Meeting, Sophie, CFO, CDC Investment
4   Prospecting
然后,我尝试用以下代码分析文本:

import nltk
top_N = 50
txt = df.Subject.str.lower().str.replace(r'\|', ' ')
words = nltk.tokenize.word_tokenize(txt)
word_dist = nltk.FreqDist(words)

stopwords = nltk.corpus.stopwords.words('english')
words_except_stop_dist = nltk.FreqDist(w for w in words if w not in stopwords) 

rslt = pd.DataFrame(word_dist.most_common(top_N), columns=['Word', 'Frequency'])
print(rslt)

我得到的错误消息是:“Series”对象没有属性“Subject”

引发错误是因为您已将
df
转换为此行中的一个系列:

df = activities.filter(['Subject'],axis=1)
所以当你说:

txt = df.Subject.str.lower().str.replace(r'\|', ' ')
df是序列,没有序列属性。尝试替换为:

txt = df.str.lower().str.replace(r'\|', ' ')
或者,不要在之前和之后将数据帧过滤为单个系列

txt = df.Subject.str.lower().str.replace(r'\|', ' ')
应该有用

[更新]


我上面所说的是不正确的,正如前面指出的那个样,过滤器并没有返回一个序列,而是返回一个只有一列的数据帧

抛出错误是因为您已将
df
转换为此行中的一个系列:

df = activities.filter(['Subject'],axis=1)
所以当你说:

txt = df.Subject.str.lower().str.replace(r'\|', ' ')
df是序列,没有序列属性。尝试替换为:

txt = df.str.lower().str.replace(r'\|', ' ')
或者,不要在之前和之后将数据帧过滤为单个系列

txt = df.Subject.str.lower().str.replace(r'\|', ' ')
应该有用

[更新]

我上面所说的是不正确的,正如前面指出的那个样,过滤器并没有返回一个序列,而是返回一个只有一列的数据帧

数据:
主题
“呼叫:Quadria Capital-Lo May,副总裁”
呼叫:雷夫斯托克-安东尼·海斯(高级助理)。。。
哥伦比亚合作伙伴:WW成功了(不确定是否会。。。
会议,Sophie,CDC投资首席财务官
探矿
#读入数据
df=pd.read_剪贴板(sep=',')

更新代码:
  • 将所有单词转换为小写,并删除所有非字母数字字符
    • txt=df.Subject.str.lower()
  • words=nltk.tokenize.word\u tokenize(txt)
    ,抛出一个
    TypeError
    ,因为
    txt
    是一个
    系列。
    
    • 下面的代码标记数据帧的每一行
  • 对单词进行标记,将每个字符串拆分为一个
    列表
    。在本例中,查看
    df
    将显示一个
    tok
    列,其中每一行都是一个列表
导入nltk
作为pd进口熊猫
顶部=50
#替换所有非字母数字字符
df['sub_rep']=df.Subject.str.lower().str.replace('\W','')
#标记化
df['tok']=df.sub_rep.apply(nltk.tokenize.word_tokenize)

  • 要分析列中的所有单词,将各个行列表合并为一个列表,称为
    单词
#将所有标记化单词添加到列表中
words=df.tok.tolist()#这是一个列表列表
words=[列表中的单词对列表中的单词]
#频率分布
word_dist=nltk.FreqDist(单词)
#删除停止字
stopwords=nltk.corpus.stopwords.words('english'))
文字(除停止文字外)=nltk.FreqDist(如果w不在停止文字中,则w代表文字中的w)
#输出结果
rslt=pd.DataFrame(最常见的单词(顶部),列=['word','Frequency'])
输出
rslt
: 数据:
主题
“呼叫:Quadria Capital-Lo May,副总裁”
呼叫:雷夫斯托克-安东尼·海斯(高级助理)。。。
哥伦比亚合作伙伴:WW成功了(不确定是否会。。。
会议,Sophie,CDC投资首席财务官
探矿
#读入数据
df=pd.read_剪贴板(sep=',')

更新代码:
  • 将所有单词转换为小写,并删除所有非字母数字字符
    • txt=df.Subject.str.lower()
  • words=nltk.tokenize.word\u tokenize(txt)
    ,抛出一个
    TypeError
    ,因为
    txt
    是一个
    系列。
    
    • 下面的代码标记数据帧的每一行
  • 对单词进行标记,将每个字符串拆分为一个
    列表
    。在本例中,查看
    df
    将显示一个
    tok
    列,其中每一行都是一个列表
导入nltk
作为pd进口熊猫
顶部=50
#替换所有非字母数字字符
df['sub_rep']=df.Subject.str.lower().str.replace('\W','')
#标记化
df['tok']=df.sub_rep.apply(nltk.tokenize.word_tokenize)

  • 要分析列中的所有单词,将各个行列表合并为一个列表,称为
    单词
#将所有标记化单词添加到列表中
words=df.tok.tolist()#这是一个列表列表
words=[列表中的单词对列表中的单词]
#频率分布
word_dist=nltk.FreqDist(单词)
#删除停止字
stopwords=nltk.corpus.stopwords.words('english'))
文字(除停止文字外)=nltk.FreqDist(如果w不在停止文字中,则w代表文字中的w)
#输出结果
rslt=pd.DataFrame(最常见的单词(顶部),列=['word','Frequency'])
输出
rslt

尝试将
df.Subject
替换为just
df
?尝试将
df.Subject
替换为just
df
?谢谢Dever,我尝试了第一个选项,但出现了这个错误:“DataFrame”对象没有属性“str”。第二个选项给了我这个其他错误:TypeError:预期的字符串或类似字节的对象
activities.filter(['Subject'],axis=1)
不返回series。它返回带有1列的数据帧。@Esther不确定为什么会出现此错误。我可以执行与行
txt=df.Subject.str.lower().str.replace(r'\\\',''类似的操作
并且没有收到属性错误。我假设这就是抛出错误的地方,对吗?是的。我想我需要在这里深入挖掘一下。文件可能有问题。我们会随时通知你的!@Esther:检查
NaN
df.Subject
中的任何非字符串值,谢谢Dever,我尝试了第一个选项,我得到了这个错误:“DataFrame”对象没有属性“str”。第二个选项给了我这个其他错误:TypeError:应该是字符串或字节,比如object
act