[英]How to make a matrix of 0 and 1?
我有一個包含一些行的文件。 每行包含一個波斯語句子,一個制表符和一個英語單詞,用於顯示每個句子的類。 我必須從該文件中提取1000個最常見的單詞,然后再創建一個矩陣。 此矩陣的列是文件的類別(某些文件有2個類別,一些3個,還有更多),行是這1000個單詞(如下圖所示(這是一個帶有英語單詞的小樣本,但我的是波斯語d1至d5是類)。 我必須檢查每個類中的每個1000個單詞,如果那里存在,將1添加到矩陣(在自己的位置),如果不存在,則添加0。如何制作這樣的矩陣?
def makeMatrix(file):
with open (file, encoding = "utf-8") as f1:
for line in f1:
line = line.strip().split("\t")
lin = line[0].split()
for word in lin:
????????????
樣本矩陣:
樣本文件: https : //www.dropbox.com/s/fx33cac3qemizmj/train1.txt?dl=0
稍有不同的數據結構至少在最初可能會更好。
我建議使用dict
,將單詞作為鍵,將一組類用作值。
請注意,我無法閱讀波斯語,因此我不知道這些單詞的含義,並且在將IPython的結果復制到此答案中時可能會有左右問題。 我事先表示歉意。
首先,我們讀取文件。
In [1]: with open('train1.txt', encoding = "utf-8") as f1:
...: lines = f1.readlines()
...:
導入我們需要的一些類型,創建數據字典和頻率計數器。
In [2]: from collections import defaultdict
In [3]: from collections import Counter
In [4]: data = defaultdict(set)
In [5]: freq = Counter()
將每一行分成一個句子和一個分類。 接下來,將每一行拆分為單詞。 將單詞的分類添加到數據,並將單詞添加到計數器。
In [6]: for ln in lines:
...: sentence, classification = ln.strip().split('\t')
...: for word in sentence.split():
...: data[word].add(classification)
...: freq.update([word])
...:
讓我們看看五個最常用的詞是什么。
In [7]: freq.most_common(5)
Out[7]: [('پر', 53), ('اوقات', 3), ('فراغت', 3), ('زمین', 3), ('لطافت', 2)]
(這里有一個LTR / RTL問題,在IPython中看起來很不一樣。)
現在查看數據以查看它們屬於哪些類。
In [8]: for word in [t[0] for t in freq.most_common(5)]:
...: print(word, data[word])
...:
پر {'full', 'fill'}
اوقات {'fill'}
فراغت {'fill'}
زمین {'full', 'fill'}
لطافت {'full'}
使用這種方法,您可以輕松地檢查數據中是否包含單詞:
In [9]: 'اوقات' in data
Out[9]: True
您可以輕松檢查它屬於哪些類:
In [10]: data['اوقات']
Out[10]: {'fill'}
編輯:
現在將其轉換為矩陣。 我將向您展示在沒有numpy
情況下使用numpy
。
首先,沒有numpy
。 矩陣可以表示為嵌套列表。 我使用的是較小的(10x5)矩陣,而不是1000x5,因為train1數據集不是那么大。 初始矩陣用零填充,以后適當的項目將設置為1。
In [11]: m = [[0,0,0,0,0] for j in range(10)]
注意:不要使用[[0,0,0,0]]*10
,因為那樣會生成內部列表的淺表副本 !
對於第一個索引,我們將使用十個最常用的詞:
In [12]: J = [p[0] for p in freq.most_common(10)]
對於第二個索引,我們使用以下類別:
In [14]: K = ['fill', 'full', 'foo', 'bar', 'baz']
現在設置項目。
In [16]: for j, word in enumerate(J):
...: for cat in data[word]:
...: m[j][K.index(cat)] = 1
...:
結果矩陣:
In [17]: m
Out[17]:
[[1, 1, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[1, 1, 0, 0, 0],
[1, 1, 0, 0, 0],
[1, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0]]
對於numpy,它大致相同:
In [18]: import numpy as np
In [21]: m2 = np.zeros((10,5), dtype=np.uint8)
In [22]: for j, word in enumerate(J):
...: for cat in data[word]:
...: m2[j, K.index(cat)] = 1
...:
In [23]: m2
Out[23]:
array([[1, 1, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[1, 1, 0, 0, 0],
[1, 1, 0, 0, 0],
[1, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0]], dtype=uint8)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.