2017-09-06 17 views
0

我需要计算生物实体共同出现的PMI分数,例如, Gene A - Gene BGene C - Disease A。已从Pubtator中提取了共现。我使用Python 3.用于从计数:数据帧或矩阵计算PMI的策略

对于一组文档,我已经通过共现类别提取了所有实体的各个计数freq(x)freq(y),例如, Gene-GeneGene-Disease,并且我有实体对freq(x,y)的同现计数。所有计数均存储在Dict中。

什么是从原始计数计算逐点互信息(PMI)分数的最佳方法:

  • 创建两个数据帧(一个用于个人计数和一个共生计数)
  • 创建两个矩阵? (同上)
  • 另一种方法?

考虑到一组数据有3列:entity, category, count,而另一组有4列:entity_a, category, entity_b, count其中类别表示同现类别。我需要用于个体实体计数的类别,因为如果我使用它们的总计数,它会扭曲给定同现类型的结果。

我试过数据框的方法,但不知道如何创建一个新的PMI列,计算结果使用两个不同的数据框架(DFs),因此我想也许矩阵方法可能会更好?如果是这样,为什么?数据的

实例时转化成的DF:

df1.head():

ent rel count 177 5197 Gene_Gene 2 176 56744 Gene_Gene 2 175 12766 Gene_Gene 2 174 3091 Gene_Gene 2 173 3162 Gene_Gene 2

df2.head():

ent_a rel ent_b count 247 5197 Gene_Gene 56744 1 246 12766 Gene_Gene 5197 1 245 12766 Gene_Gene 56744 1 244 3091 Gene_Gene 3162 1 243 3091 Gene_Gene 54583 1

的PMI式:

enter image description here

回答

0

我发现为我工作的策略包括使用DataFrames(DFs)和numpy数组。

在第一步中,DF可用于查找并填充df2以及共同出现实体的各自单独计数。然后,在第二步中,使用numpy数组来高效地计算每个同现事件的(近似)PMI得分。

步骤1:查找个人计数

  • 第一分裂共现实体和每个添加到新的柱例如:

    df_ab['ent_a'] = df_ab.ent_ab.apply(lambda x: x.split('-')[0])

  • 然后调用一个查找函数获得个人数量,例如:

    df_ab['ent_a_count'] = df_ab.ent_a.apply(get_ent, args=(df_a, 'ent_a',))

    那里查找函数如下:

    def get_ent(ent_df_ab, df_a, colname_df_ab): row_df_a = df_a[df_a[colname_df_ab] == ent_df_ab] i = row_df_a.iloc[0]['count'] return i

df2现在看起来是这样

``` 
     ent_ab count_ab  type ent_a ent_b ent_a_count ent_b_count 
0 5197-56744   2 Gene_Gene 5197 56744   2   2 
1 12766-5197   1 Gene_Gene 12766 5197   2   1 
2 12766-56744   1 Gene_Gene 12766 56744   2   2 
3 3091-3162   4 Gene_Gene 3091 3162   6   1 
4 3091-54583   2 Gene_Gene 3091 54583   6   1 
``` 

步骤2:矢量化PMI演算通货膨胀

  • numpy的基于阵列的,用于计算分数

    def compute_pmi(df): count_ab = np.array(df[['count_ab']]) ent_a_count = np.array(df[['ent_a_count']]) ent_b_count = np.array(df[['ent_b_count']]) pmi = np.round(count_ab/(ent_a_count * ent_b_count), 3) df['pmi'] = pmi return df

功能