簡體   English   中英

"Python:從句子中刪除重復字符但保留單詞含義"

[英]Python : Remove repeating characters from sentence but retain the words meaning

我想從句子中刪除重復的字符,但要使單詞仍然保留其含義(如果有的話)。 例如: I'm so haaappppyyyy about offline school<\/code> to I'm so happy about offline school<\/code> . 我對離線學校感到非常高興,我對離線學校感到非常高興。 看, haaappppyyyy<\/code>變得happy<\/code> , offline & school<\/code>保持不變,而不是離線和ofline & schol<\/code>

我嘗試了兩種解決方案,使用 RE 和 itertools,但沒有一個真正適合我正在尋找的東西

使用正則表達式:

tweet = 'I'm so haaappppyyyy about offline school'
repeat_char = re.compile(r"(.)\1{1,}", re.IGNORECASE)
tweet = repeat_char.sub(r"\1\1", tweet)
tweet = re.sub("(.)\\1{2,}", "\\1", tweet)

您可以在這里通過迭代字符串中的所有單詞來組合正則表達式和 NLP,一旦找到具有相同連續字母的單詞,將它們減少到最多 2 次連續出現相同字母並運行自動拼寫檢查以修復拼寫。

查看示例 Python 代碼:

import re
from textblob import TextBlob
from textblob import Word
rx = re.compile(r'([^\W\d_])\1{2,}')
print( re.sub(r'[^\W\d_]+', lambda x: Word(rx.sub(r'\1\1', x.group())).correct() if rx.search(x.group()) else x.group(), tweet) )
# => "I'm so happy about offline school"

好吧,首先你需要一個所有允許單詞的列表(或集合)來進行比較。

我會假設(這可能是錯誤的)沒有單詞包含超過兩個重復字符的序列。 因此,為每個單詞生成所有潛在候選者的列表,例如“haaapppppyyyy”會產生你[“haappyy”、“happyy”、“happy”等]。 那么只需通過與允許的單詞列表進行比較來檢查其中一個單詞實際存在的問題。 這樣做的時間復雜度很高,所以如果它需要快速運行,那么在它上面扔一個哈希表或其他東西:)

正則表達式並不總是最好的解決方案<\/h2>

用於驗證格式或輸入的正則表達式<\/h3>

正則表達式通常用於低級模式識別和替換。 我可能對格式驗證有用。 您可以將其視為“轉儲”自動化。

語言學(NLP)<\/h3>

當涉及自然語言 (NLP) 或此處的拼寫(字典)時,語義可能會起作用。 根據上下文,“ass”和“as”都可能拼寫正確,盡管語義非常不同。 (我為這些粗魯的例子道歉,但我不是母語人士,這兩者的含義最明顯,具體取決於重復)。

對於這些情況,正則表達式或簡單的模式識別可能是不夠的。 與研究特定語言的庫或解決方案(包括其簡單的應用程序)相比,正確應用它可能需要付出更多的努力。

正則表達式可能難以處理的拼寫示例<\/h3>

就像“haappy”(拼寫無效,但只有重復的元音“aa”,而不是輔音“pp”)和“yeees”(不包含正確拼寫的重復)或“kiss”(正確拼寫重復的輔音)之間的區別)

拼寫更正需要更多<\/h2>

例如,要查找重復字符(元音或輔音)是否有效以正確拼寫單詞形式的字典。

考慮一個拼寫糾正模塊<\/h3>

您可以使用textblob<\/code><\/a>模塊進行拼寫更正<\/strong><\/a>:

安裝: pip install textblob<\/code>

給出測試用例的示例:

印刷:

盡管您可能期望“是”作為更正的結果(就像我一樣)。

也可以看看:

暫無
暫無

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

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