如何使用Python查詢文字檔案的Zipf分布

2021-10-07 10:45:21 字數 3397 閱讀 8376

您可能想知道術語zipf分布。 要理解這個術語的含義,我們需要首先定義齊普夫定律。 別擔心,我會把一切保持簡單。

zipf定律簡單地指出,給定某種自然語料的語料庫(大型且結構化的文字集),出現頻率最高的單詞的頻率大約是第二出現頻率的單詞的兩倍,第三出現頻率的單詞的三倍,是第四個最常見的單詞的四倍,依此類推。

這個詞佔7%左右的布朗語料庫字(略超過1萬字69971)。 如果我們來話,我們會發現,它佔了3.6%左右的語料庫(約一半)。 因此,我們可以注意到齊普夫定律適用於這種情況。

因此,齊普夫定律試圖告訴我們,少量物品通常佔我們觀察到的大部分活動。 例如,少數疾病(癌症,心血管疾病)佔大量死亡。 這也適用於佔文學中所有單詞出現次數最多的單詞,以及我們生活中的許多其他示例。

由於該檔案超出了本教程的範圍,因此我將不對其進行詳細描述,我們只需要使用它來試驗我們的**即可。

第一步要做的是open檔案:

open_file = open('d2016.bin', 'r')
為了對bin檔案執行必要的操作,我們需要將檔案載入到字串變數中。 可以使用read()函式簡單地實現這一點,如下所示:

file_to_string = open_file.read()
模組。

至此,我們已經讀取了bin檔案並將其內容載入到字串變數中。 查詢zipf的分布意味著查詢bin檔案中單詞出現的頻率。 正規表示式將因此用於在檔案中定位單詞。

我們將用來進行匹配的方法是findall()方法。 如關於findall()re模組文件中所述,該方法將:

返回string中的pattern的所有非重疊匹配項,作為字串列表。

從左到右掃瞄該字串 ,並以找到的順序返回匹配項。

如果模式中存在乙個或多個組,則返回乙個組列表;否則,返回乙個列表。

如果模式包含多個組,則這將是乙個元組列表。

空匹配項將包括在結果中,除非它們碰到另乙個匹配項的開頭。

我們要做的是編寫乙個正規表示式,該表示式將查詢文字字串變數中的所有單個單詞。 可以執行此任務的正規表示式為:

\b[a-za-z][a-z]\b
其中\b是字邊界的錨點。 在python中,可以這樣表示:

words = re.findall(r'(\b[a-za-z][a-z]\b)', file_to_string)
這個正規表示式基本上告訴我們要找到所有以字母(大寫或小寫)開頭,然後是由至少2字元且不超過9字元的字母序列組成的單詞。 換句話說,將包含在輸出中的單詞的大小範圍為310字元長。

現在我們可以執行乙個迴圈,該迴圈旨在計算每個單詞的出現頻率:

for word in words:

count = frequency.get(word,0)

frequency[word] = count + 1

在此,如果在單詞列表中仍未找到該單詞,則不引發keyerror,而是返回預設值0。 否則,count會增加1,代表該單詞在列表中到目前為止出現的次數。

最後,我們將列印字典的鍵值對,顯示單詞(鍵)及其在列表中的出現次數(值):

for key, value in reversed(sorted(frequency.items(), key = itemgetter(1))):

print key, value

sorted(frequency.items(), key = itemgetter(1))這部分sorted(frequency.items(), key = itemgetter(1))值公升序對輸出進行排序,即顯示從出現頻率最低到出現頻率最高的單詞。 為了在開頭列出最常用的單詞,我們使用reversed()方法。

在檢視了程式的不同構建塊之後,讓我們看一下它們的外觀:

import re

from operator import itemgetter

frequency = {}

open_file = open('d2016.bin', 'r')

file_to_string = open_file.read()

words = re.findall(r'(\b[a-za-z][a-z]\b)', file_to_string)

for word in words:

count = frequency.get(word,0)

frequency[word] = count + 1

for key, value in reversed(sorted(frequency.items(), key = itemgetter(1))):

print key, value

我將在這裡顯示程式返回的前十個單詞及其頻率:

the 42602

abcdef 31913

and 30699

abbcdef 27016

was 17430

see 16189

with 14380

under 13127

for 9767

abcdefv 8694

從這個齊普夫分布,我們可以在一些字(高頻詞)表示本體的話,如我們可以看到上面驗證齊普夫定律theandwasfor。 這也適用於序列abcdefabbcdefabcdefv,它們是頻繁出現的字母序列,具有某些特定於此檔案的含義。

在本教程中,我們已經了解了python如何使使用zipf定律等統計概念變得容易。 特別是在處理大型文字檔案時,python非常方便,如果要手動找到zipf的發行版,這將需要大量的時間和精力。 如我們所見,我們能夠快速載入,解析並找到大小為28 mb的檔案的zipf分發。 更不用說使用python的字典對輸出進行排序的簡單性了。

翻譯自:

Python如何讀寫文字檔案?

1.讀取文字檔案 f open test.txt r print f.read f.seek 0 print f.read 14 f.seek 0 print f.readline print f.readline f.seek 0 print f.readlines f.seek 0 for li...

Python 如何讀寫文字檔案

關於檔案操作,參考 python 檔案操作 一 檔案儲存與讀取的步驟 1 思路 str.encode 編碼格式 對unicode字串進行編碼,編碼成連續位元組的格式,才能存放到檔案中,即物理介質上 str.decode 解碼格式 對物理介質上的連續位元組資料進行解碼,解碼常unicode格式的資料,...

python 查詢文字檔案的層次

i o系統有一系列的層次構建而成 下面是操作乙個文字檔案的例子來檢視這種層次 f open sample.txt w f sample.txt mode w encoding utf 8 f.buffer io.bufferedwriter name sample.txt f.buffer raw ...