[英]Create a frequency matrix for bigrams from a list of tuples, using numpy or pandas
[英]Calculating the frequency of each word in the transition matrix, using numpy and pandas only
我正在嘗試計算轉換矩陣中每個單詞的頻率,僅使用 numpy 和 pandas。
我有一個字符串
star_wars = [('darth', 'leia'), ('luke', 'han'), ('chewbacca', 'luke'),
('chewbacca', 'obi'), ('chewbacca', 'luke'), ('leia', 'luke')]
我使用這個問題為這個字符串構建了一個矩陣。
chewbacca darth han leia luke obi
chewbacca 0 0 0 0 2 1
darth 0 0 0 1 0 0
han 0 0 0 0 1 0
leia 0 0 0 0 1 0
luke 0 0 0 0 0 0
obi 0 0 0 0 0 0
現在我正在嘗試使用這個問題將這些單詞值轉換為概率:
使用交叉表適用於初始 dataframe,但只給我成對
pd.crosstab(pd.Series(star_wars[1:]),
pd.Series(star_wars[:-1]), normalize = 1)
Output 是錯誤的,這也不適用於我創建的矩陣,只是一個例子:
col_0 (chewbacca, luke) (chewbacca, obi) (darth, leia) (luke, han)
row_0
(chewbacca, luke) 0.0 1.0 0.0 1.0
(chewbacca, obi) 0.5 0.0 0.0 0.0
(leia, luke) 0.5 0.0 0.0 0.0
(luke, han) 0.0 0.0 1.0 0.0
我還創建了一個 function
from itertools import islice
def my_function(seq, n = 2):
it = iter(seq)
result = tuple(islice(it, n))
if len(result) == n:
yield result
for elem in it:
result = result[1:] + (elem,)
yield result
應用 function 並計算概率
pairs = pd.DataFrame(my_function(star_wars), columns=['Columns', 'Rows'])
counts = pairs.groupby('Columns')['Rows'].value_counts()
probs = (counts/counts.sum()).unstack()
print(probs)
但它給了我對的計算(甚至不確定它是否正確)
Rows (chewbacca, luke) (chewbacca, obi) (leia, luke) \
Columns
(chewbacca, luke) NaN 0.2 0.2
(chewbacca, obi) 0.2 NaN NaN
(darth, leia) NaN NaN NaN
(luke, han) 0.2 NaN NaN
Rows (luke, han)
Columns
(chewbacca, luke) NaN
(chewbacca, obi) NaN
(darth, leia) 0.2
(luke, han) NaN
另一種嘗試,只使用crosstab
期望關於 - 具有概率而不是數字的矩陣。
例如
chewbacca darth han leia luke obi
chewbacca 0 0 0 0 0.66 0.33
darth 0 0 0 1 0 0
han 0 0 0 0 1 0
leia 0 0 0 0 1 0
luke 0 0 0 0 0 0
obi 0 0 0 0 0 0
感謝您的時間和幫助!
我們仍然可以通過crosstab
來完成
df=pd.DataFrame(star_wars)
s=pd.crosstab(df[0],df[1],normalize='index')
s=s.reindex(index=df.stack().unique(),fill_value=0).reindex(columns=df.stack().unique(),fill_value=0)
s
1 darth leia luke han chewbacca obi
0
darth 0 1.0 0.000000 0.0 0 0.000000
leia 0 0.0 1.000000 0.0 0 0.000000
luke 0 0.0 0.000000 1.0 0 0.000000
han 0 0.0 0.000000 0.0 0 0.000000
chewbacca 0 0.0 0.666667 0.0 0 0.333333
obi 0 0.0 0.000000 0.0 0 0.000000
要從轉換矩陣中獲取概率,只需將每一行除以行總和即可。
>>> df / df.values.sum(axis=1).reshape((-1,1))
chewbacca darth han leia luke obi
chewbacca 0.0 0.0 0.0 0.0 0.666667 0.333333
darth 0.0 0.0 0.0 1.0 0.000000 0.000000
han 0.0 0.0 0.0 0.0 1.000000 0.000000
leia 0.0 0.0 0.0 0.0 1.000000 0.000000
luke NaN NaN NaN NaN NaN NaN
obi NaN NaN NaN NaN NaN NaN
當然,您應該確保在最后兩行中不要除以零。 如果行總和為零,則該行的所有條目都為零,因此您可以將這些行總和替換為您想要的任何內容。
>>> row_sums = df.values.sum(axis=1)
>>> row_sums[row_sums == 0] = 1
>>> df / row_sums.reshape((-1,1))
chewbacca darth han leia luke obi
chewbacca 0.0 0.0 0.0 0.0 0.666667 0.333333
darth 0.0 0.0 0.0 1.0 0.000000 0.000000
han 0.0 0.0 0.0 0.0 1.000000 0.000000
leia 0.0 0.0 0.0 0.0 1.000000 0.000000
luke 0.0 0.0 0.0 0.0 0.000000 0.000000
obi 0.0 0.0 0.0 0.0 0.000000 0.000000
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.