微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

共现矩阵中的Scipy相关矩阵用于通过社区检测进行主题建模

如何解决共现矩阵中的Scipy相关矩阵用于通过社区检测进行主题建模

基本上,我正在尝试实现此目标... https://www.youtube.com/watch?v=sI7VpFNiy_I&t=20m

在我被困在这里之后,另一个人正在台阶上 Second-order cooccurrence of terms in texts

我的问题是... 为什么我的示例中的函数“ A”失败? 在我的示例中如何使函数“ A”起作用?

在上面的视频中,Thomas定义了一个函数(下面的函数“ A”),该函数采用一个共同出现矩阵并返回相关矩阵。

我只是走出熊猫之路,变得肮脏,所以我不知道代码中发生了什么,或者代码是否仍然有效。

def _association_matrix(self,matrix):
    O=matrix.copy()
    #N compute expected matrix
    N=O.sum(1).sum()
    R=O.copy()
    R.data=np.ones(len(R.data))
    R.data=R.data/N
    
    Fx_old=np.array(O.sum(1).flatten())
    Fy_old=np.array(O.sum(0).flatten())
    
    Fx=spdiags(Fx_old,Fx_old.shape[0],Fx_old.shape[0])
    Fy=spdiags(Fy_old,Fy_old.shape[0],Fy_old.shape[0])
    
    Fx=Fx.tocsc()
    Fy=Fy.tocsc()
    
    E=Fx*R*Fy
    E.tocsc()
    
    #compute poisson association measure
    
    poi=E.copy()
    poi.data=(np.sign(O.data-E.data)*
              (O.data*np.log(O.data/E.data)-
              (O.data-E.data)))
    
    return poi

我在我制作的共现矩阵上尝试了该代码(下面的代码),但出现以下错误 ValueError:无法将输入数组从形状(5158)广播到形状(1)

from nltk.corpus import state_union
StateofUnion=[]
for i in state_union.fileids():
    StateofUnion.append(state_union.raw(i))
import pandas as pd
#I didn't download most of nltk so just loading all of nltk isnt heavy for me,but would be heavy for most users
import nltk
years=pd.Series(state_union.fileids()).str.slice(stop=4)
presidents=pd.Series(state_union.fileids()).str.slice(start=5,stop=-4)
presidents=presidents.str.replace('|'.join(['1','2','-']),'')
party=[]
for i in presidents:
    if i=='Truman':
        party.append('dem')
    elif i=='Eisenhower':
        party.append('rep')
    elif i=='Kennedy':
        party.append('dem')
    elif i=='Johnson':
        party.append('dem')
    elif i=='Johnson-2':
        party.append('dem')
    elif i=='Johnson-1':
        party.append('dem')    
    elif i=='Nixon':
        party.append('rep')
    elif i=='Ford':
        party.append('rep')
    elif i=='Carter':
        party.append('dem')
    elif i=='Reagan':
        party.append('rep')
    elif i=='Bush':
        party.append('rep')
    elif i=='Bush-1':
        party.append('rep')
    elif i=='Bush-2':
        party.append('rep')
    elif i=='Clinton':
        party.append('dem')
    elif i=='GWBush':
        party.append('rep')
    elif i=='GWBush-1':
        party.append('rep')
    elif i=='GWBush-2':
        party.append('rep')    
fileid=pd.Series(state_union.fileids()).str.slice(stop=-4)        
SOUA=pd.DataFrame({'Address':StateofUnion,'Year':years,'President':presidents,'Party':party,'recid':fileid})

#A simple cleaning function,yes it's bad- its also good enough for Now
def scrub(pandascolumn):
    #assumes we are dealing with pandas
    from nltk.corpus import stopwords
    from nltk.tokenize import word_tokenize
    stop = stopwords.words('english')
    #Destroys Sentence Tokenization
    badchars=['!','@','#','$','%','ą','ś','^','&','\.',','\'','\)','\(','\[','\]','\?','\:','\--','\;']
    pattern = '|'.join(badchars)
    return pandascolumn.str.lower().\
           str.replace(pattern,'').\
           apply(word_tokenize).\
           apply(lambda x: [item for item in x if item not in stop]).\
           apply(' '.join)

SOUA=SOUA.set_index('recid')
SOUA['ScrubbedAddress']=scrub(SOUA['Address'])

def get_skip_bigram(Series,n,k):
    return Series.str.split().apply(lambda x: list(nltk.skipgrams(x,k)))

grams=get_skip_bigram(SOUA[SOUA['President']=='Clinton']['ScrubbedAddress'],2,1)


skiplist=[]
for i in range(0,len(grams)):
    for j in grams[i]:
        skiplist.append(list(j))

def get_vocab(doc):
    vocab=set()
    for i in range(0,len(doc)):
        vocab.update(doc[i])
    return vocab

vocab=get_vocab(skiplist)


import scipy.sparse as sp
voc2id = dict(zip(vocab,range(len(vocab))))
rows,cols,vals = [],[],[]
for r,d in enumerate(skiplist):
    for e in d:
        rows.append(r)
        cols.append(voc2id[e])
        vals.append(1)
X=sp.csc_matrix((vals,(rows,cols)))        


Xc=X.T*X
Xc.setdiag(0)
print(Xc.toarray())

from scipy import sparse
def _association_matrix(matrix):
    O=matrix.copy()
    #N compute expected matrix
    N=O.sum(1).sum()
    R=O.copy()
    R.data=np.ones(len(R.data))
    R.data=R.data/N
    
    
    Fx_old=np.array(O.sum(1).flatten())
    Fy_old=np.array(O.sum(0).flatten())
    
    
    Fx=spdiags(Fx_old,Fy_old.shape[0])
    
    Fx=Fx.tocsc()
    Fy=Fy.tocsc()
    
    E=Fx*R*Fy
    E.tocsc()
    
    #compute poisson association measure
    
    poi=E.copy()
    poi.data=(np.sign(O.data-E.data)*
              (O.data*np.log(O.data/E.data)-
              (O.data-E.data)))
    
    return poi

_association_matrix(Xc)

产生错误的部分是“ Fx.tocsc()”,我不明白为什么或如何解决错误

同样,我有两个紧迫的问题。 为什么我的示例中的功能 A ”失败? 在我的示例中如何使函数 A ”起作用?

除这3个以外,显然Thomas's work flow的实现对于主题建模社区来说是非常好的。这就是我们正在努力的方向。如果您能解决这个问题,那就更好了。 topic model workflow

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。