2012-12-03 35 views
10

我有大量人名(例如「john smith」)。我想通過名字在其中查找人物。但是,某些查詢會拼寫錯誤(例如「jon smth」,「johnsm iith」)。是否有拼寫糾正庫與Python綁定,可能會找到拼寫糾正匹配我?人名拼寫更正(Python)

我知道Whoosh和Python-aspell。 Whoosh的拼寫更正對我來說不太合適,因爲它將正確拼寫的集合寫入磁盤,而不是將其存儲在內存中。這使我的應用程序查找速度太慢。由於代碼的結構是如何改變這種行爲似乎並不是微不足道的。此外,飛快移動並不會對不同的角色編輯進行不同的處理,即使'y'更可能與'i'(「jim kazinsky」 - >「jim kazinski」)混淆,而不是'z' 。

Aspell與人名無法很好地配合,因爲名字通常包含空格--Aspell認爲這個詞是修正的基本單位。此外,據我瞭解,Aspell使用拼寫糾正的n-gram模型,而不是字符編輯距離模型。雖然n-gram模型對字典單詞有意義,但它對名稱不起作用:人們「bob ruzatoxg」和「joe ruzatoxg」有許多共同的稀有卦,因爲它們具有相同的罕見姓氏。但他們顯然是不同的人。

我還應該提到,我不能將每個查詢與集合中的所有條目進行比較 - 這會太慢。一些索引需要預先構建。

謝謝!

回答

6

聽起來像(沒有雙關語意在那裏),你需要某種形式的Metaphone algorithm,它已經在Python中實現,並可在Pypi:http://pypi.python.org/pypi/Metaphone/0.4上獲得。

還有其他的算法,如LevenshteinSoundex(還沒有找到一個可靠的Python實現這個) - 你可能想要使用多個這樣的計算某種形式的度量(也許甚至給不同的權重對每個結果)提出可能更正的結果列表。

+0

Metaphone庫看起來很有用,謝謝你。如果我最終爲自己的名字寫了自己的拼寫檢查程序(而且我仍然抱着某人已經寫了一個我可以使用的希望),我可能會使用Metaphone匹配度量的一部分。 – Jeff

+0

Levenshtein庫看起來更適合兩個字符串之間的成對匹配。我不認爲我可以使用它,因爲那樣我必須將每個查詢與我的集合中的每個名稱字符串進行比較。但是,對於Metaphone庫,我應該能夠在處理查詢之前爲我的集合中的名稱的語音表示建立一個字典。 – Jeff

+2

[fuzzywuzzy](http://seatgeek.com/blog/dev/fuzzywuzzy-fuzzy-string-matching-in-python)可能是一個選項。 – Matthias