做中文查询纠错,需要一个拼音到中文词汇的对应表。网上找不到,只要利用baidu来构建一个。
原理:
难点是多音字。输入一个词,根据拼音汉字表,可以得到其搜有发音,比如“银行”的发音有可能有 “yinhang”, “yinxing”,哪一个才是对的呢?
发送 GET 请求到 to baidu.com,
"http://www.baidu.com/s?bs=zhongguo&f=8&wd=yinhang"
从搜索结果可以得到,
您要找的是不是: 银行 ,
百度一下,找到相关网页约170,000篇,用时 0.070秒
这样就可以知道” yinhang“是”银行“正确的发音。
步骤
1. 利用拼音汉字表, 构造 汉字->拼音 hash 表。
2. 对词表的每一个词汇,得到所有的拼音候选。如果只有一个,就是得到一个结果。
如果有多个发音,到步骤3。
3. 发送 GET 请求到 to baidu.com, "http://www.baidu.com/s?bs=zhongguo&f=8&wd=*****" (候选拼音)
4. 分析返回结果,得到正确的发音。
注意,由于发送GET到baidu太慢,采用用200个线程,
下面是python代码
#!/usr/bin/python
import sys
import chardet
import re
import httplib
from urllib2 import Request, HTTPError, URLError, urlopen
from httplib import InvalidURL
import urlparse, re, urllib, logging, StringIO, logging
import htmllib
from os.path import join, getsize
import threading
verbose = False
#编码转换
def transcode(s):
try:
encode_dict = chardet.detect(s)
if encode_dict["encoding"] == "GB2312" :
s = unicode(s,"gb18030").encode("utf-8")
if encode_dict["encoding"] == "gbk" :
s = unicode(s,"gb18030").encode("utf-8")
if isinstance(s, unicode):
s = s.encode('utf-8')
return s
except:
return s
pinyin_map = dict();
#构造拼音词汇表,因为拼音词汇表格式可能不一样,所以省略
def generate_pinyin_map():
#省略
def generate_synonym_worker( input_file, out_file, idx ):
f = open(input_file+"_"+str(idx), 'r')
of = open(out_file+"_"+str(idx), 'w+')
of.seek(0, 2)
idx = 0
for eachline in f:
idx += 1
try:
eachline = unicode(eachline,'utf-8')
eachline = eachline[:-1]
words = re.split(u' +', eachline)
pinyin = generate_pinyin_canadiate(words[0], of)
except:
pass
f.close()
of.close()
#两百个线程
num_worker = 200
#map
def split(input_file):
f = open(input_file, 'r')
files = []
for idx in range(num_worker):
files.append( open(input_file+"_"+str(idx), 'w') )
idx = 0
for eachline in f:
idx += 1
files[idx%num_worker].write(eachline)
for onefile in files:
onefile.close()
#reduce
def merge(out_file):
outf = open(out_file, 'w+')
files = []
for idx in range(num_worker):
file_name = out_file+"_"+str(idx)
f = open(file_name, 'r')
for eachline in f:
outf.write(eachline)
f.close()
outf.close
#产生拼音词汇表
def generate_synonym(input_file, out_file):
split( input_file )
thread_pool = []
for i in range(num_worker):
th = threading.Thread(target=generate_synonym_worker, args=(input_file, out_file ,i) ) ;
thread_pool.append(th)
# start threads one by one
for i in range(num_worker):
thread_pool[i].start()
#collect all threads
for i in range(num_worker):
threading.Thread.join(thread_pool[i])
merge(out_file)
#枚举所有的拼音组合
def listlist_enumerate(listlist, count):
result = []
if count <= 0:
return result
if count == 1:
for item in listlist[0]:
aa = []
aa.append(item)
result.append(aa)
else:
pre_result = listlist_enumerate(listlist, count-1)
result = []
for one in pre_result:
for item in listlist[count-1]:
bb = list(one)
bb.append(item)
result.append( bb )
return result
def makeutf8(s):
#ESCAPE = re.compile(r'[\x00-\x17\\"\b\f\n\r\t]')
ESCAPE = re.compile(r'[\x00-\x1f]')
ESCAPE_DCT = {}
for i in range(32):
ESCAPE_DCT.setdefault(chr(i), ' ')
#ESCAPE_DCT.setdefault(chr(i), '\\%02x' % (i,))
#ESCAPE_DCT.setdefault(chr(i), '^%c' % (ord('@')+i) )
def replace(match):
return ESCAPE_DCT[match.group(0)]
s = ESCAPE.sub(replace, s)
if isinstance(s, unicode):
s = s.encode('utf-8')
return s
def generate_pinyin_canadiate(chinese_word,fd):
listlist = []
for uchar in chinese_word:
if pinyin_map.has_key(uchar) and len(pinyin_map[uchar]):
listlist.append( pinyin_map[uchar] )
else:
listlist.append( uchar )
listlist = listlist_enumerate(listlist, len(listlist))
for alist in listlist:
canadiate = ''.join(alist)
canadiate = canadiate.lower()
print canadiate
query = ""
try:
query = urllib.urlencode({'wd' : canadiate})
except:
pass
url = 'http://www.baidu.com/s?%s'%(query)
search_results = urllib.urlopen(url).read()
search_results = transcode(search_results)
print url, canadiate #, search_results
r_suggest = re.compile('<a href="s\?wd=(.*)&f=12&oq='%dict(pinyin=canadiate), re.I|re.S)
re_match = r_suggest.findall( search_results )
if re_match:
try:
s = urllib.unquote(re_match[0])
s= unicode(s,'gb18030')
fd.write(canadiate + " " + makeutf8(s) + "\n")
fd.flush()
if s == chinese_word:
print "one hit: ", canadiate, chinese_word
#fd.write(canadiate + " " + makeutf8(chinese_word) + "\n")
fd.flush()
return canadiate
except:
pass
return None
def run( input_file, out_file):
generate_pinyin_map( )
generate_synonym( input_file, out_file )
if 1 and __name__ == "__main__":
args = sys.argv[1:]
if len(args) < 2:
print "USage: ./synonym.py <input_wordlist> <output_file> "
else:
run(args[0], args[1]);
分享到:
相关推荐
百度停用词词表,亲测可用
### 百度停用词表知识点详解 #### 一、停用词概念解析 在自然语言处理(NLP)领域,停用词是指在信息检索分析、文本挖掘等任务中通常被过滤掉的词语。这类词语通常是那些出现频率非常高但实际含义较少、对语句意义...
"百度停用词表baidu_stopwords"是一个专门用于中文NLP任务的停用词列表,由百度公司提供,它包含了大量在中文文本中常见的无意义或低信息量的词语。 这个停用词表的用途广泛,主要涉及以下几个方面: 1. **文本...
英文停用词表,1000个停用词左右,满足大部分的去停用词情况
总的来说,利用“百度停用词表文件”能有效提升中文自然语言处理任务的效率和准确性,它是NLP从业者和爱好者不可或缺的工具之一。正确理解和运用停用词表,将有助于我们更好地挖掘文本数据中的深层信息。
本资源“哈工大停用词表、中文停用词表、百度停用词表(全).zip”提供了三个不同来源的停用词表,分别是哈工大(HIT)、中文通用和百度的停用词表,这些词表对于中文文本的处理尤其重要。接下来,我们将详细探讨...
由中文停用词表:cn_stopwords.txt,哈工大停用词表:hit_stopwords.txt,百度停用词表:baidu_stopwords.txt,四川大学机器智能实验室停用词库:scu_stopwords.txt(https://github.com/goto456/stopwords)合并而...
哈工大停用词表和百度停用词表是中文处理中广泛使用的两个停用词库。 哈工大停用词表(HIT Stopword List)是由哈尔滨工业大学计算机科学与技术学院开发的,适用于中文文本处理。该词表包含了大量中文常用的无实际...
在这个名为"同义词表,反义词表,否定词表.zip"的压缩包中,包含了一个名为"chinese_dictionary-master"的项目,很可能是用于提供中文词汇的这些语义关系数据。 首先,同义词表是收集了具有相似或相同意义的词语...
中文停用词表 cn_stopwords.txt 哈工大停用词表 hit_stopwords.txt 百度停用词表 baidu_stopwords.txt 四川大学机器智能实验室停用词库 scu_stopwords.txt 中文大全版 cn_all_stopwords.txt
jieba停用词分词表
停用词表在自然语言处理...对于开发者和研究人员来说,理解和利用这些停用词表是提升自然语言处理性能的关键步骤之一。而"stopwords-master"这样的资源集合,为用户提供了便利,使得停用词管理变得更加高效和灵活。
2. **百度停用词表.txt**:源自百度公司的停用词列表,适应大规模网络文本处理。 3. **四川大学机器智能实验室停用词库.txt**:可能包含了四川大学研究团队在特定领域或任务上的停用词集。 4. **哈工大停用词表.txt*...
在实际应用中,可以结合这些停用词表,通过编程语言(如Python)中的自然语言处理库(如jieba、NLTK、spaCy等)来实现文本的停用词过滤。通过加载停用词表,对文本进行分词处理后,去除其中的停用词,从而达到优化...
Python 数据分析机器学习领域哈工大、川大等常用停用词表
多版本 中文停用词表 英文停用词表 中英文停用词表 以及python停用词词表合并程序(2个)
文本分析--停用词集合(结合哈工大停用词表、四川大学机器智能实验室停用词库、百度停用词表等)文本分析--停用词集合(结合哈工大停用词表、四川大学机器智能实验室停用词库、百度停用词文本分析--停用词集合(结合...
哈工大停用词表、四川大学机器智能实验室停用词库以及百度停用词表都是业界广泛使用的中文停用词资源。这些词表是由专业机构和研究团队根据大量语料库的统计分析和专家知识精心筛选出来的,涵盖了日常语言中常见的无...
百度停用词表:作为中国最大的搜索引擎公司,百度的停用词表基于海量的互联网搜索数据,包含了网络语言的特色,尤其适用于处理网络文本和用户查询。该表可能包含了更多的网络流行语和缩写,使得处理网络数据时能更...