簡體   English   中英

如何制作一個0和1的矩陣?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM