[英]What is an efficient way to replace specific words (but not words that include the string in criteria)?
[英]Efficient way of resolving unknown words to known words?
我正在設計一個文本處理程序,它將從一個長的逐項文本文檔生成一個關鍵字列表,並組合相似的詞語條目。 有指標,但我有一個新的問題,處理我正在使用的字典中沒有的單詞。
我目前正在使用nltk和python,但我在這里的問題更具抽象性。 給定一個不在字典中的單詞,將它解析為字典內的單詞的有效方法是什么? 我目前唯一的解決方案是通過字典中的單詞並從輸入的單詞中選擇具有最短Levenshtein距離(編輯距離)的單詞。
顯然這是一個非常緩慢且不切實際的方法,我實際上並不需要字典中的絕對最佳匹配,只要它是一個包含的單詞並且非常接近。 在解決方案中,效率對我來說更重要,但也需要基本的准確度。
關於如何將一些未知單詞解析為字典中已知單詞的任何想法?
看起來你需要一個拼寫校正器來匹配你詞典中的單詞。 以下代碼適用於本博客http://norvig.com/spell-correct.html ,由Peter Norvig撰寫,
import re, collections
def words(text): return re.findall('[a-z]+', text.lower())
def train(features):
model = collections.defaultdict(lambda: 1)
for f in features:
model[f] += 1
return model
NWORDS = train(words(file('big.txt').read()))
alphabet = 'abcdefghijklmnopqrstuvwxyz'
def edits1(word):
splits = [(word[:i], word[i:]) for i in range(len(word) + 1)]
deletes = [a + b[1:] for a, b in splits if b]
transposes = [a + b[1] + b[0] + b[2:] for a, b in splits if len(b)>1]
replaces = [a + c + b[1:] for a, b in splits for c in alphabet if b]
inserts = [a + c + b for a, b in splits for c in alphabet]
return set(deletes + transposes + replaces + inserts)
def known_edits2(word):
return set(e2 for e1 in edits1(word) for e2 in edits1(e1) if e2 in NWORDS)
def known(words): return set(w for w in words if w in NWORDS)
def correct(word):
candidates = known([word]) or known(edits1(word)) or known_edits2(word) or [word]
return max(candidates, key=NWORDS.get)
big.txt是包含已知單詞的詞典。
你的任務聽起來真的只是非單詞拼寫糾正,所以一個相對直接的解決方案是使用現有的拼寫檢查器,如aspell和自定義詞典。
一種快速而骯臟的方法是使用像metaphone這樣的語音映射(這是aspell使用的算法之一)。 對於從您的詞典派生的每個可能的代碼,選擇一個代表性的單詞(例如,組中最常用的單詞)作為修正建議,並為沒有找到匹配的情況選擇默認修正。 但是使用aspell你可能會得到更好的結果。
如果您確實想要計算編輯距離,可以通過在嘗試中存儲字典和可能的編輯操作來相對快速地完成,請參閱Brill和Moore(2000) 。 如果你有一個體面大小的拼寫錯誤及其修正語料庫並且可以實現Brill和Moore的整個方法,你可能會相當多地擊敗aspell,但它聽起來像aspell(或任何拼寫檢查器,可以讓你創建自己的字典)足以完成你的任務。
希望這個答案不是太模糊:
1)聽起來你可能需要首先查看你的標記化和短語分塊層。 在將它們提交給任何模糊拼寫檢查之前,您應該丟棄符號短語塊。
2)我仍然會建議編輯距離,以便在此之后找出任何“拼寫錯誤”令牌的替代方案,但這可能會返回一個同樣接近的可能列表。
3)當你有可能的列表時,你可以使用共生算法從這個列表中選擇最相似的候選者。 我只有一些可以提供幫助的軟件的例子( http://www.linguatools.de/disco/disco_en.html#was )。 您可以提交一個單詞,這將返回該單詞的不同共現單詞。 然后,您可以將此列表與“拼寫錯誤”單詞的上下文進行比較,並從所有可能的編輯距離單詞中選擇重疊最多的單詞。
我沒有看到使用Levenshtein距離找到一個意義相似的詞的理由。 LD看形式(你想把“公共汽車”映射到“卡車”而不是“灌木”)。
正確的解決方案取決於您接下來要做什么。
除非你真的需要那些未知單詞中的信息,否則我只需將它們全部映射到一個通用的“UNKNOWN_WORD”項。
顯然,您可以根據其上下文和其他功能對未知單詞進行聚類(例如,它們是以大寫字母開頭)。 對於上下文聚類:因為你對意義感興趣,我會使用一個更大的窗口來表示這些單詞(比如+/- 50個單詞),並且可能使用一個簡單的單詞包模型。 然后,您只需使用一些距離度量(例如余弦)找到一個已知單詞,其空間中的向量最接近未知單詞。 如果您需要更多相關信息,請與我們聯系。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.