【发布时间】:2017-11-06 04:14:01
【问题描述】:
我一直在尝试对我的数据库表使用拼写更正器来更正一个表中的地址,为此我使用了http://norvig.com/spell-correct.html 的引用 使用 Address_mast 表作为字符串集合,我正在尝试更正和更新“customer_master”中更正后的字符串
地址桅杆
ID Address
1 sonal plaza,harley road,sw-309012
2 rose apartment,kell road, juniper, la-293889
3 plot 16, queen's tower, subbden - 399081
4 cognizant plaza, abs road, ziggar - 500234
现在从参考代码中,它只对那些“远离单词的两次编辑”的单词进行了处理。但我试图在 3 或 4 之前执行此操作,同时尝试更新那些更正的单词到其他表。这里是包含拼写错误单词的表,将用更正的单词进行更新
Customer_master
Address_1
josely apartmt,kell road, juneeper, la-293889
zoonal plaza, harli road,sw-309012
plot 16, queen's tower, subbden - 399081
cognejantt pluza, abs road, triggar - 500234
这是我尝试过的
import re
import pyodbc
import numpy as np
from collections import Counter
cnxn = pyodbc.connect('DRIVER={SQLServer};SERVER=localhost;DATABASE=DBM;UID=ADMIN;PWD=s@123;autocommit=True')
cursor = cnxn.cursor()
cursor.execute("select address as data from Address_mast")
data=[]
for row in cursor.fetchall():
data.append(row[0])
data = np.array(data)
def words(text): return re.findall(r'\w+', text.lower())
WORDS = Counter(words(open('data').read()))
def P(word, N=sum(WORDS.values())):
"Probability of `word`."
return WORDS[word] / N
def correction(word):
"Most probable spelling correction for word."
return max(candidates(word), key=P)
def candidates(word):
"Generate possible spelling corrections for word."
return (known([word]) or known(edits1(word)) or known(edits2(word)) or known(edits3(word)) or known(edits4(word)) or [word])
def known(words):
"The subset of `words` that appear in the dictionary of WORDS."
return set(w for w in words if w in WORDS)
def edits1(word):
"All edits that are one edit away from `word`."
letters = 'abcdefghijklmnopqrstuvwxyz'
splits = [(word[:i], word[i:]) for i in range(len(word) + 1)]
deletes = [L + R[1:] for L, R in splits if R]
transposes = [L + R[1] + R[0] + R[2:] for L, R in splits if len(R)>1]
replaces = [L + c + R[1:] for L, R in splits if R for c in letters]
inserts = [L + c + R for L, R in splits for c in letters]
return set(deletes + transposes + replaces + inserts)
def edits2(word):
"All edits that are two edits away from `word`."
return (e2 for e1 in edits1(word) for e2 in edits1(e1))
def edits3(word):
return (e3 for e2 in edits2(word) for e3 in edits1(e2))
def edits4(word):
return (e4 for e3 in edits3(word) for e4 in edits1(e3))
sqlstr = ""
j=0
k=0
for i in data:
sqlstr=" update customer_master set Address='"+correction(data)+"' where data="+correction(data)
cursor.execute(sqlstr)
j=j+1
k=k+cursor.rowcount
cnxn.commit()
cursor.close()
cnxn.close()
print(str(k) +" Records Completed")
从此我无法获得正确的输出,任何关于应该进行哪些更改的建议..在此先感谢
【问题讨论】:
-
您可以在 C# 或其他编程语言中使用 Fuzzy Lookup 组件的(SSIS)API 来使用内置方式查找匹配项
-
您似乎忘记在
candidates()中包含新的edits3和edits4函数。或者你的输出有什么不当之处? -
@RachelAmbler 是的,customer_master 表包含一些带有一些拼写错误的单词的地址(因为该列是从其他印度地区语言到英语的文本派生的)。因此,我正在尝试应用拼写纠正器来纠正我错误翻译的文本并将其替换为更正后的文本。为此,我将 address_mast 数据作为我的参考或包含相似或正确单词的训练数据。
-
我的问题仍然存在:“正确输出”到底缺少什么?您修复了阻止算法生成变体广告 LD 3 和 4 的错误,那么还有什么问题?非常具体:生产的是什么,它与您想要的有什么不同?
标签: python sql-server nlp spell-checking spelling