大数据集:频繁测试成员关系
题面儿
Roy Liu <[email protected]> reply-to [email protected] to [email protected] date Mon, Mar 9, 2009 at 19:28 subject [CPyUG:80888] 大数据集,频繁测试成员关系,各位有何建议
需要编写一个针对技术文档翻译后的校对工作的小程序,不知各位能否给点建议。
- 我的需要是这样的:
- 在进行翻译之前,发包方会提供一个中英对照的标准术语翻译表(放在 Excel 文件中),翻译人员在翻译文档时,如果遇到相应的术语,就要按照对方提供的术语表来翻译。
- 这个程序的作用就是预先识别出待翻译文档中的所有术语,并用特殊格式显示出文档中包含的术语,以便提醒翻译人员。
- 我在做法是这样的:
- 把术语表读取出来,做成一个字典 textPair{},其中以英文术语作为键值,以中文翻译作为项值,即 textPair[En] = Ch。
- 将待翻译文档中的内容,分割成一个一个句子(用翻译工具可以做到这个),然后将这些句子装入一个列表 transPair[] 中。
- 然后:
for term in textPair: for sentence in transPair: if term in sentence: do something
但是,我发现这样做的效率很低,自己又没什么更好的方法,因此来这里看看,希望有高手能共同探讨一下。
ZSP
张沈鹏 <[email protected]> reply-to [email protected] to [email protected] date Mon, Mar 9, 2009 at 19:53
囧 英文的 很好办
- 虽然我有一个能牛XX的多模式匹配不过这里还用不到;just 改一下 循环
for sentence in transPair: result=[] for term in sentence.split(' '): if term in textPair: result.append("xxxxxxxxxxxxx") else: result.appned(term) print " ".join(result)
多模式匹配
张沈鹏 <[email protected]> reply-to [email protected] to [email protected] date Tue, Mar 10, 2009 at 07:33
算了 我还是扔出牛逼无比的多模式匹配吧
感谢伟大的redsea前辈,因为代码是他抠出来的:)
- 建议
- 单个单词用我原来给的方法
- 多个单词用多模式匹配
- 这样效率最高
见附件: attachment:zspy.7z
- 2.5应该可以用;其他的要自己编译一下
- 当然,极度高效的做法是去改多模式匹配的封装 修改他的回调函数不过还是2-3次扫描比较快
- attachment:多模式匹配算法简介.pdf
- 类似这样???
Liming_Do <[email protected]> reply-to [email protected] to [email protected] date Tue, Mar 10, 2009 at
>>> text = '''This performance tuning guide is designed to help database administrators and developers configure Microsoft SQL Server 2000 for maximum performance and to assist in determining causes of poor performance of relational databases, including those used in data warehousing. SQL Server 2000 has been dramatically enhanced to create a largely auto-configuring and self-tuning database server.''' >>> >>> maptable = { 'Microsoft SQL Server 2000' : '{{Microsoft SQL Server 2000}}' , 'SQL Server 2000 ' : '{{SQL Server 2000}} ', 'data warehousing' : '数据仓库' , 'relational databases' : '关系数据库' , } >>> import re >>> def trans(maptable, text): for key in maptable: text = re.compile(key, re.M).sub(maptable[key], text.rstrip()) + '\n' print text >>> >>> trans(maptable, text) This performance tuning guide is designed to help database administrators and developers configure {{Microsoft SQL Server 2000}} for maximum performance and to assist in determining causes of poor performance of 关系数据库, including those used in 数据仓库. {{SQL Server 2000}} has been dramatically enhanced to create a largely auto-configuring and self-tuning database server.
Trie树
张沈鹏 <[email protected]> reply-to [email protected] to [email protected] date Tue, Mar 10, 2009 at 07:39
其实,这个算法更合适
attachment:Trie树.7z
索引法
shell909090 <[email protected]> reply-to [email protected] to [email protected] date Tue, Mar 10, 2009 at 00:09
这个么——空间换时间,索引法。 首先我做出如下假定:
len (textPair) = N len (transPair) = M
sentence中平均有Q个单词。 那么,我来标记一下你算法的时间消耗。
for term in textPair: # N for sentence in transPair: # M if term in sentence: # N*M*len(term)*len(sentence) = N*len(term)*文章长度 do something
而后,我建议你构造一个开链hash表,来索引整个查找过程。 令某个单词的索引key为这个单词的头5个字母(当然,具体你可以调整),那么你连 分割句子都不用做,只要持续的给我供给单词流,就可以鉴别这个单词流。
#索引建立过程 hash_table = {}; for word in tranPair: if word[:5] not in hash_table: hash_table[word[:5]] = []; hash_table[word[:5]].append (word); #匹配过程 for word in f_get_word (trans_info): # 文章单词数 if word[:5] in hash_table: # log2 (N) match = hash_table[word[:5]]; # log2 (N) for term in match: # 碰撞率,通常是N/所有常见的开头。大约应该是2-3之间。 if term match the rest of the sentence: # 较差估计为 平均碰撞率 * 文章单词数 do something
具体的理论,计算过程,还有优化什么的我就不说了。上面的东西纯属于抛砖引玉,可能还有更好的办法。不过我用类似的方法存储分词辞典的(准确的说,当时用的是红黑树加tied树)。
反馈
创建 by -- ZoomQuiet [DateTime(2009-03-10T03:02:14Z)]