将NLTK的条件频率分布转换为Pandas数据框

10 投票
4 回答
9523 浏览
提问于 2025-04-17 17:29

我正在尝试使用nltk生成的ConditionalFreqDist表格,但找不到任何关于如何将这个表格写入csv文件或导出到其他格式的文档。我希望能把它放到pandas的数据框中,这样写入csv就很简单了。我找到的唯一一个讨论建议将CFD对象进行序列化,但这并没有真正解决我的问题。

我写了一个函数,用来把nltk的ConditionalFreqDist对象转换成pd.DataFrame:

def nltk_cfd_to_pd_dataframe(cfd):
    """ Converts an nltk.ConditionalFreqDist object into a pandas DataFrame object. """

    df = pd.DataFrame()
    for cond in cfd.conditions():
        col = pd.DataFrame(pd.Series(dict(cfd[cond])))
        col.columns = [cond]
        df = df.join(col, how = 'outer')

    df = df.fillna(0)

    return df

不过,如果我要这样做,或许直接写一个新的ConditionalFreqDist函数,让它一开始就生成pd.DataFrame会更合理。但在我重新发明轮子之前,我想看看是否有我遗漏的技巧——无论是在NLTK还是其他地方,让ConditionalFreqDist对象能够与其他格式对接,最重要的是能导出到csv文件。

谢谢。

4 个回答

6

你可以把 FreqDist 当作一个字典来使用,然后可以通过 from_dict 方法从这个字典创建一个数据框。

fdist = nltk.FreqDist( ... )    
df_fdist = pd.DataFrame.from_dict(fdist, orient='index')
df_fdist.columns = ['Frequency']
df_fdist.index.name = 'Term'
print(df_fdist)
df_fdist.to_csv(...)

输出结果:

                      Frequency
Term
is                    70464
a                     26429
the                   15079
9

当然可以!请看下面的内容:

在编程中,有时候我们需要让程序在特定的条件下执行某些操作。比如说,如果你想让程序在某个数字大于10的时候,显示“这个数字很大”,你就需要用到条件判断。

条件判断就像是在问一个问题:如果这个条件成立,那么就做某件事情。就像你在生活中会问:“如果今天下雨,我要不要带伞?”如果答案是“是”,那么你就会带伞;如果答案是“否”,你就不带。

在代码里,这种判断通常用“if”语句来实现。你可以把它想象成一个开关,只有在条件满足的时候,开关才会打开,程序才会执行你想要的操作。

希望这个解释能帮助你更好地理解条件判断的概念!

pd.DataFrame(freq_dist.items(), columns=['word', 'frequency'])
2

好的,我写了一个条件频率分布的函数,它接收一个元组的列表,类似于 nltk.ConditionalFreqDist 函数,但返回的是一个 pandas 数据框对象。这个方法比把 cfd 对象转换成数据框要快。

def cond_freq_dist(data):
    """ Takes a list of tuples and returns a conditional frequency distribution as a pandas dataframe. """

    cfd = {}
    for cond, freq in data:
        try:
            cfd[cond][freq] += 1
        except KeyError:
            try:
                cfd[cond][freq] = 1
            except KeyError:
                cfd[cond] = {freq: 1}

    return pd.DataFrame(cfd).fillna(0)

撰写回答