2015-11-12 70 views
1

我是Python和本論壇的初學者,請原諒模糊的描述或錯誤。從文件中讀取文本,然後寫入其他文件,並在文本中重複標記

我在讀取/寫入文件時遇到問題。我想要做的是從文件中讀取文本,然後找到多次出現的單詞,將它們標記爲repeated_word然後將原始文本寫入另一個文件,但重複單詞用星號標記在他們周圍標誌。

我發現很難理解我將如何比較單詞(沒有標點符號等),但仍然能夠將單詞的原始上下文寫入文件。

我被推薦使用一些正則表達式,但我不知道如何使用它。另一種方法是迭代文本字符串並標記和標準化,通過遍歷每個字符進行排序,然後在每個單詞之外創建某種類型的av對象或元素。

我很感謝任何人如何解決這個問題。主要的問題不在於如何查找重複的單詞,而是如何標記它們,然後將它們寫入文件的上下文中。有些編碼的幫助將非常感謝,謝謝。

編輯 我已經更新了我的代碼到目前爲止。如果有什麼你會認爲「壞編碼」,請評論它。

爲了解釋白名單課程,作業分爲兩個部分,一個是我應該標記單詞的地方,另一個是關於白名單,其中包含「允許重複」的單詞,因此不會被標記。

我已經閱讀了大量關於正則表達式的東西,但我仍然無法弄清楚如何使用它。

回答

0

如果您知道該文本只包含字母字符,那麼忽略a-z之外的字符可能比嘗試刪除所有標點符號更容易。

下面是刪除不AZ或空間中的所有字符的一種方法:

file = ''.join(c for c in file if 97 <= ord(c) <= 122 or c == ' ') 

這工作,因爲ord()返回給定字符的ASCII碼,和ASCII 97-122代表AZ(小寫) 。

然後,你要分割到的那些話,你可以完成,像:

words = file.split() 

如果你把它傳遞給Counter數據結構將統計每個單詞的出現。

counter = Counter(file.split) 

然後counter.items()將包含從單詞到出現次數的映射。

0

好的。我認爲這是一項家庭作業,所以我不會給你一個完整的解決方案。但是,你真的需要做很多事情。

首先是將輸入文件讀入內存。然後將它分解成可能包含在列表中的組件字(標記化它),適當清理以去除雜亂的標點符號。您似乎正在順利完成此操作,但我建議您查看可用於字符串的split()strip()方法。

您需要考慮您是否希望計數區分大小寫,因此您可能希望將列表中的每個單詞轉換爲(比如說)小寫以保持一致。所以你可以用for循環和字符串lower()方法來做到這一點,但列表理解可能更好。

然後,您需要查看單詞列表並計算每個單詞出現的次數。如果你檢查出collections.Counter,你會發現這樣做對你來說很繁重,或者你需要建立一個詞典,其中包含單詞作爲鍵和單詞的數量。 (您也可以在這裏查看collections.defaultdict課程)。

最後,您需要仔細閱讀您從文件中讀取的文本,並且對於包含多個匹配項的每個單詞(即字典或計數器中的計數大於1),請適當標記它。正則表達式旨在完成這種事情。所以我建議你看看re庫。

完成之後,您只需將結果寫入文件,該文件非常簡單。

最後,對於您的文件操作(讀寫),我建議您考慮用with ... as之一替換try ... except構造。

1

基本上,你需要做兩件事:找出哪些單詞重複,然後將這些單詞中的每一個轉換成別的東西(即原始單詞帶有一些標記)。由於無法通過整個文件知道哪些單詞重複,因此您需要進行兩遍。

第一遍,您需要做的就是從文本中提取單詞並計算每個單詞出現的次數。爲了確定這些詞是什麼,你可以使用正則表達式。一個好的起點可能是

regex = re.compile(r"[\w']+") 

功能re.compile從字符串創建正則表達式。這個正則表達式匹配任何一個或多個單詞字符(\w)或撇號的序列,所以它會捕獲收縮但不是標點符號,我認爲在很多「正常」的英文文本中應該捕獲所有單詞。

創建了正則表達式對象後,可以使用它的finditer方法遍歷文本中正則表達式的所有匹配項。

for word in regex.finditer(text): 

您可以使用Counter class來計算每個單詞出現的次數。 (我把這個實現留作練習。:-P這個文檔應該是相當有幫助的。)

當你計算出每個單詞出現的次數後,你將不得不挑出那些計數爲2或更多,並想出一些方法在輸入文本中識別它們。我認爲一個正則表達式也可以幫助你。具體而言,您可以通過編譯由|連接的字組成的字符串來創建一個正則表達式對象,該對象將匹配任何選定的單詞集。

regex = re.compile('|'.join(words)) 

其中wordslistset或一些迭代。既然你是Python的新手,我們不要太花哨(儘管可以);只需編碼一種方式來通過Counter或任何其他方式,並創建一個list所有單詞的計數爲2或更多,然後創建正則表達式,如我所示。

一旦你有了,你可能會受益於sub method,它接受一個字符串並用其他文本替換正則表達式的所有匹配。在你的情況下,替換文本將是原來的那個字,周圍有星號,所以你可以這樣做:

new_text = regex.sub(text, r'*\0*') 

在正則表達式替換,\0是指無論是通過正則表達式匹配。

最後,您可以將new_text寫入文件。

+0

非常感謝你。我想我理解使用的方法,但是我仍然對如何使用正則表達式模塊感到非常不安。另外,用這種方法,這些單詞是否可以獲得任何指數或某種位置?這很好,因爲我應該能夠改變間隔的長度(這個單詞需要在所選擇的單詞數量的間隔中重複,以便將其視爲重複)。 – newbie

+0

這可能是另一個問題。您可能希望查看'enumerate'函數以訪問單詞索引,但當您這樣做時,問題會變得更加複雜。 –

相關問題