在Python

时间:2017-11-11 16:09:33

标签: python nlp

我有一个语料库,我在其中计算unigrams和skipgrams的频率,通过将它们除以所有频率的总和来对值进行标准化,并将它们输入到pandas数据帧中。现在,我想计算每个跳跃图的点互信息,即跳数的归一化频率的对数除以跳数中两个非标志的乘法归一化频率。

我的数据框架如下所示:

unigram_df.head()
              word  count      prob
0          nordisk      1  0.000007
1           lments      1  0.000007
2             four     91  0.000593
3          travaux      1  0.000007
4  cancerestimated      1  0.000007

skipgram_df.head()
                      words  count      prob
0                 (o, odds)      1  0.000002
1  (reported, pretreatment)      1  0.000002
2       (diagnosis, simply)      1  0.000002
3           (compared, sbx)      1  0.000002
4             (imaging, or)      1  0.000002

现在,我通过迭代skipgram_df的每一行,提取skipgram的概率值,提取两个unigrams的概率值,然后计算日志,并将结果附加到其中来计算每个skipgram的PMI值。名单。

代码看起来像这样,并且工作正常:

for row in skipgram_df.itertuples():
    skipgram_prob = float(row[3])
    x_unigram_prob = float(unigram_df.loc[unigram_df['word'] == str(row[1][0])]['prob'])
    y_unigram_prob = float(unigram_df.loc[unigram_df['word'] == str(row[1][1])]['prob'])
    pmi = math.log10(skipgram_prob/(x_unigram_prob*y_unigram_prob))
    pmi_list.append(pmi)

问题是迭代整个数据帧需要很长时间(300,000个跳数上大约30分钟)。我将不得不处理甚至比那个大10到20倍的语料库,所以我正在寻找一种更有效的方法来做到这一点。任何人都可以建议更快的另一种解决方案吗?谢谢。

1 个答案:

答案 0 :(得分:0)

我也在尝试解决类似的问题。我不知道如何提高代码的性能,但是您可以将其并行化,因为每个计算都相互独立。 Pandas df.iterrow() parallelization