簡體   English   中英

從文件中讀取文本,然后寫入另一個文件,並標記文本中的重復

[英]Reading text from a file, then writing to another file with repetitions in text marked

我是 Python 和這個論壇的初學者,所以請原諒任何含糊的描述或錯誤。

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

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

有人建議我使用正則表達式,但我不知道如何使用它。 另一種方法是遍歷文本字符串並標記化和規范化,通過遍歷每個字符進行排序,然后從每個單詞中生成某種 av 對象或元素。

我感謝任何可能對如何解決這個問題有想法的人。 主要問題不是如何找到重復的單詞,而是如何標記它們,然后將它們寫入上下文中的文件。 對編碼的一些幫助將不勝感激,謝謝。

編輯我已經用我到目前為止提出的內容更新了代碼。 如果有任何您認為“糟糕的編碼”的地方,請發表評論。

為了解釋白名單類,作業有兩個部分,一個是我應該標記單詞的地方,另一個是關於白名單的,其中包含“允許重復”的單詞,因此不應被標記。

我已經閱讀了大量關於正則表達式的內容,但我仍然無法理解如何使用它。

基本上,您需要做兩件事:找出重復的單詞,然后將這些單詞中的每一個轉換為其他單詞(即,原始單詞周圍帶有一些標記)。 由於在不遍歷整個文件的情況下無法知道哪些單詞重復了,因此您需要進行兩次遍歷。

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

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

函數re.compile從字符串創建一個正則表達式。 這個正則表達式匹配一個或多個單詞字符( \\w )或撇號的任何序列,因此它會捕獲收縮但不會捕獲標點符號,我認為在許多“正常”英文文本中這應該捕獲所有單詞。

創建正則表達式對象后,您可以使用它的finditer方法迭代文本中此正則表達式的所有匹配項。

for word in regex.finditer(text):

您可以使用Counter來計算每個單詞出現的次數。 (我將實現作為練習。:-P 文檔應該很有幫助。)

在計算出每個單詞出現的次數后,您必須挑選出次數為 2 或更多的單詞,並想出某種方法在輸入文本中識別它們。 我認為正則表達式在這里也能幫到你。 具體來說,您可以通過編譯由|連接的單詞組成的字符串來創建一個正則表達式對象,該對象將匹配任何選定的單詞集。 .

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

其中words是一個listset或一些可迭代的。 既然你是 Python 的新手,讓我們不要太花哨(盡管可以); 只需編寫一種方法來通過您的Counter或其他任何東西,並創建一個包含計數為 2 或更多的所有單詞的list ,然后按照我向您展示的那樣創建正則表達式。

一旦你有了它,你可能會從sub方法中受益,它接受一個字符串並用一些其他文本替換其中的正則表達式的所有匹配項。 在您的情況下,替換文本將是帶有星號的原始單詞,因此您可以執行以下操作:

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

在正則表達式替換中, \\0指代正則表達式匹配的任何內容。

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

如果您知道文本僅包含字母字符,則忽略 az 之外的字符可能比嘗試刪除所有標點符號更容易。

這是刪除所有非 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()將包含從單詞到出現次數的映射。

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

首先是將輸入文件讀入內存。 然后將其拆分為可能包含在列表中的組成詞(標記化),適當清理以刪除雜散的標點符號。 您似乎在這方面做得很好,但我建議您查看可用於字符串的split()strip()方法。

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

然后,您需要瀏覽單詞列表並計算每個單詞出現的次數。 如果您查看collections.Counter您會發現它為您完成了繁重的工作,或者,您將需要構建一個以單詞作為關鍵字和單詞計數的字典。 (您可能還想在此處查看collections.defaultdict類)。

最后,您需要仔細閱讀從文件中讀取的文本,並為其中包含的每個匹配項(即字典或計數器中的計數 > 1)的單詞進行適當標記。 正則表達式就是為了做這種事情而設計的。 所以我建議你看看re庫。

完成后,您只需將結果寫入文件,這很簡單。

最后,關於您的文件操作(讀取和寫入),我建議您考慮將try ... except構造替換為with ... as一個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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