[英]Create a frequency matrix for bigrams from a list of tuples, using numpy or pandas
我对 Python 很陌生。 我有一个元组列表,我在其中创建了二元组。
这个问题非常接近我的需求
my_list = [('we', 'consider'), ('what', 'to'), ('use', 'the'), ('words', 'of')]
现在我正在尝试将其转换为频率矩阵
所需的 output 是
consider of the to use we what words
consider 0 0 0 0 0 0 0 0
of 0 0 0 0 0 0 0 0
the 0 0 0 0 0 0 0 0
to 0 0 0 0 0 0 0 0
use 0 0 1 0 0 0 0 0
we 1 0 0 0 0 0 0 0
what 0 0 0 1 0 0 0 0
words 0 1 0 0 0 0 0 0
如何做到这一点,使用numpy
或pandas
? 不幸的是,我只能看到nltk
的东西。
您可以创建频率数据框并按单词调用索引值:
words=sorted(list(set([item for t in my_list for item in t])))
df = pd.DataFrame(0, columns=words, index=words)
for i in my_list:
df.at[i[0],i[1]] += 1
output:
consider of the to use we what words
consider 0 0 0 0 0 0 0 0
of 0 0 0 0 0 0 0 0
the 0 0 0 0 0 0 0 0
to 0 0 0 0 0 0 0 0
use 0 0 1 0 0 0 0 0
we 1 0 0 0 0 0 0 0
what 0 0 0 1 0 0 0 0
words 0 1 0 0 0 0 0 0
请注意,在这一个中,二元组中的顺序很重要。 如果您不关心顺序,则应首先按内容对元组进行排序,使用以下方法:
my_list = [tuple(sorted(i)) for i in my_list]
另一种方法是使用Counter
进行计数,但我希望它具有相似的性能(同样,如果二元组中的顺序很重要,请从frequency_list
中删除sorted
):
from collections import Counter
frequency_list = Counter(tuple(sorted(i)) for i in my_list)
words=sorted(list(set([item for t in my_list for item in t])))
df = pd.DataFrame(0, columns=words, index=words)
for k,v in frequency_list.items():
df.at[k[0],k[1]] = v
output:
consider of the to use we what words
consider 0 0 0 0 0 1 0 0
of 0 0 0 0 0 0 0 1
the 0 0 0 0 1 0 0 0
to 0 0 0 0 0 0 1 0
use 0 0 0 0 0 0 0 0
we 0 0 0 0 0 0 0 0
what 0 0 0 0 0 0 0 0
words 0 0 0 0 0 0 0 0
如果您不太关心速度,则可以使用 for 循环。
import pandas as pd
import numpy as np
from itertools import product
my_list = [('we', 'consider'), ('what', 'to'), ('use', 'the'), ('words', 'of')]
index = pd.DataFrame(my_list)[0].unique()
columns = pd.DataFrame(my_list)[1].unique()
df = pd.DataFrame(np.zeros(shape=(len(columns), len(index))),
columns=columns, index=index, dtype=int)
for idx,col in product(index, columns):
df[col].loc[idx] = my_list.count((idx, col))
print(df)
Output:
consider to the of
we 1 0 0 0
what 0 1 0 0
use 0 0 1 0
words 0 0 0 1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.