月度归档:2011年07月

中文词汇语义相关度测试集Words-240

Deep Learning Specialization on Coursera

Words-240测试集包含240对中文词汇和人工对这些词对之间的语义相关度的评测值(和英文的WordSimilarity-353测试集类似),此测试集可以用于测试或者训练中文语义相关度算法。我们以组为单位安排人员进行测试,共分为12组,每组包含20对词。每一组词汇都有20人分别对其相关性进行量化评测, 共有240余人参与了测试。词汇之间相关性的度量值介于0到10之间(0表示这两个词之间毫不相关,10表示这两个词是同义词),我们将这20个人对某词对的评测结果的平均值作为最终结果。每个人的评价结果请参见“测试集统计结果.xls”。如果您有什么问题或者评论,请您发邮件和我们联系,邮件地址是:xiangwangcn@gmail.com

此测试集是我们为了测试中文词汇之间的语义相关度算法而构造的,请引用我们的论文:

汪祥, 贾焰, 周斌, 丁兆云, 梁政. 基于中文维基百科链接结构与分类体系的语义相关度计算. 小型微型计算机系统, 2011, 32(11):2237-2242.

欢迎大家免费使用!下载地址是:http://download.csdn.net/source/3462335

Words-240测试集得到了国防科技大学613教研室的大力支持,感谢贾焰老师、周斌老师等的指导和帮助。在构造测试集中,著名英文词汇语义相似度的测试集WordSimilarity-353的创立者Lev Finkelstein在如何选择测试集Words-240中词对的问题上进行了热心的指导,在此表示诚挚的感谢。在构造测试集的过程中,湖南师范大学的彭丹同学、湖南大学的陈军同学和国防科技大学的李虎给予了大力协助,在此表示衷心的感谢。国防科技大学、湖南师范大学和湖南大学的240余名同学无偿参与了测试,他们的无私奉献精神直接促使了本测试集的诞生,参加测试的同学有:万芬芬,李大财,吴章彬,尹晋文,邱口,黄江勇,蔡强,王刚,张伟,周晓锋,刘时,徐浩,胡燕,左文豪,吴勇,刘念松,尹波,姚鑫,张右良,周晟,王佳静,何佳,袁功彪,李晋国,谢小红,叶光辉,林建,钟勇才,杨海兵,陈聪,陈超,童国雄,周新云,邹垒,肖天赐,尹邦浩,刘伟,何花,李欢妮,焦丙丰,刘乾,张翠,艾达,伍浩,孙浩然,钟方敬,赵浒,刘哲,龚秀娟,李琦,杨瑞丽,何珂,甘玲,许念,胡蛟,孔梦娟,罗浩,刘芳,廖璨,李冬嫦,白露,皮之云,袁园,潘剑珍,杨厅,徐征,匡牧宇,王薇薇,祁曦婕,宇岳,游凤英,王昕,曹璇,吕性,张志世,杨贵芸,杨雪梅,李腾飞,廖娟,陈娅琦,彭燕,崔文秀,路俊雅,刘雅玲,曾状林,范仁娇,陈玲佳,詹会,孙梦迪,毛本,徐汇,刘婷,黎明阳,刘雨薇,王晓秀,祁美丹,程怡欣,吴之瑶,马超玲,蒋丽娟,刘娜,张芬,阮晓婷,马璞玉,刘贤霖,李西,李小芳,余立,曾惠奇,晓歪,张艳翔,曾田田,张卫,付渔,伍新春,胡朱,苏兴恺,马党,张祥洪,段丽,李文韶,黄红君,陈超,伍月,侯丽华,陆金梅,谢璐璐,谭娜娜,胡海姣,裴晓强、刘建峰,王海波等(由于隐私保护等原因,很多同学的姓名等未在此处列出),在此对他们表示感谢。

初学者报道(2):实现 1-gram分词算法

Deep Learning Specialization on Coursera

写了个1-gram的分词算法实现:

借鉴了之前在这个blog上看到的n-gram算法中的split函数的写法,其他部分自己写的。

 

Dictionary.py:

class Dictionary:
    'Dictionary Loading and Management'
    def __init__(self,dicname):
        self.dictMap={}
        self.N = 0;
        dictfile = open(dicname,'r')
        for eachLine in dictfile:
            dictstr = eachLine.decode("cp936")
            strlist = dictstr.split("\t",2)
            self.dictMap[strlist[0]] = strlist[1].split("\n",1)[0]
            self.N+=int(self.dictMap[strlist[0]])
        dictfile.close()
        print self.N
    def getCount(self,wordname):
        if(self.dictMap.has_key(wordname)):
            return int(self.dictMap[wordname])
        else:
            return 0.5;#如果词典中没有,这个词的出现次数被定为 0.5
    def getPvalue(self,wordname):
        return float(self.getCount(wordname))/self.N
    def isAWord(self,word):
        return self.dictMap.has_key(word)
        

if __name__=='__main__':
    dict1=Dictionary("dict.txt")
class Ngram:
    def __init__(self,dictionary):
        self.mDict=dictionary
        self.wordList=()
        self.valueMap = {}
        self.segMap={}
    def splitsentence(self,sentence):
        wordlist = []        
        for eachNum in range(len(sentence)):
            wordlist.append((sentence[:eachNum+1],sentence[eachNum+1:]))
        return wordlist
    def maxP(self, sentence):
        if(len(sentence)<=1):
            return self.mDict.getPvalue(sentence)
        SenSplitList = self.splitsentence(sentence);
        maxPvalue = 0;
        wordPair = [];
        wordP = 0;
        for eachPair in SenSplitList:
            if(len(eachPair[0])>0 and len(eachPair[1])>0):
                p1=0;
                p2=0
                if(self.valueMap.has_key(eachPair[0])):
                    p1=self.valueMap[eachPair[0]]
                else:
                    p1=self.maxP(eachPair[0])
                if(self.valueMap.has_key(eachPair[1])):
                    p2=self.valueMap[eachPair[1]]
                else:
                    p2=self.maxP(eachPair[1])                    
                wordP=p1*p2
            if(maxPvalue<wordP):
                maxPvalue = wordP
                wordPair = eachPair
        
        v=self.mDict.getPvalue(sentence)
        if((v)>maxPvalue and self.mDict.isAWord(sentence)):
            self.valueMap[sentence]=v
            self.segMap[sentence]=sentence
            return v
        else:
            self.valueMap[sentence]=maxPvalue
            self.segMap[sentence]=wordPair
            return maxPvalue
    def getSeg(self):
        return self.segMap
if(__name__ =="__main__"):
    ngram1 = Ngram("dict1")
    print ngram1.splitsentence("ABC")
from Dictionary import Dictionary
from ngram import Ngram

def printSeg(segMap,sentence):
    if(segMap.has_key(sentence)):
        pair = segMap[sentence]
        if(isinstance(pair,tuple)):
            printSeg(segMap,pair[0])
            printSeg(segMap,pair[1])
        else:
            if(sentence==pair):
                print sentence
            else:
                printSeg(segMap,pair)
    else:
        print sentence
    

dict1 = Dictionary("dict.txt")
while(True):
    ngram1 =Ngram(dict1)
    sentence = raw_input("please input a Chinese Sentence:").decode("cp936");
    print ngram1.maxP(sentence)
    segmap=ngram1.getSeg()
    #for eachkey in segmap:
               
     #   if(isinstance(segmap[eachkey],tuple)):
      #      print (eachkey+":"+segmap[eachkey][0]+','+segmap[eachkey][1])
       # else:
        #    print (eachkey+":"+segmap[eachkey])
    printSeg(segmap,sentence)


					

中文翻译技术沙龙第八次活动

Deep Learning Specialization on Coursera

一、沙龙主题:语料库的建设和应用
二、沙龙时间:2011年7月31日(周日)下午2-5点
三、沙龙地点:清华科技园
四、沙龙嘉宾:北京大学常宝宝老师

报名截止日期:7月29日(周五)

报名请回复邮箱cmt.salon@gmail.com

中文翻译技术沙龙的豆瓣小组是http://www.douban.com/group/304684/。

中文翻译技术沙龙的QQ群:80266425

初学者报到: 实现了一个最大匹配的分词算法

Deep Learning Specialization on Coursera

看了一段时间了的自然语言,不过还是很初级。

今天下载了一个分词的字典,自己用python写了一个分词的函数。

放上来,给大家踩,不吝赐教!

用的是最大匹配算法。

# -*- coding: cp936 -*-

import string

def loaddict():
filename=raw_input('Enter file name:')
f = open(filename,'r')

DICT={}
for eachLine in f:
dictStr = eachLine.decode('cp936')
strList=dictStr.split("\t",2)
DICT[strList[0]]=strList[1].split("\n",1)[0]
global DIC_MAXL
if(DIC_MAXL<len(strList[0])):
DIC_MAXL = len(strList[0])
f.close()
print("max length:")
print(DIC_MAXL)
return DICT;

def segmentation(dic):
sentence = unicode(raw_input('请输入中文句子:'),'cp936')
print sentence
length=len(sentence)
print('length:')
print length
global DIC_MAXL
if(length<DIC_MAXL):
wlen=length
else:
wlen=DIC_MAXL
testS=sentence
wordList=[]
while(len(testS)>0):
word=testS[0:wlen]
meet=False;
while((not meet )and (len(word)>0) ):
if(dic.has_key(word)):
wordList.append(word)
testS=testS[len(word):len(testS)]
meet=True;
else:
if(len(word)==1):
wordList.append(word)
testS=testS[len(word):len(testS)]
meet=True;
else:
word=word[0:len(word)-1]
return wordList

DIC_MAXL=0
dictionary=loaddict()
print DIC_MAXL
while(True):
wordl=segmentation(dictionary)
for eachChar in wordl:
print eachChar

真的很初级,大家轻踩!

也别不好意思踩,踩了我就能进步了!

多谢

NiuTrans: 一套开源的统计机器翻译平台

Deep Learning Specialization on Coursera

  晚上在CWMT(China Workshop on Machine Translation)的邮件组里看到东北大学自然语言处理实验室朱靖波老师的邮件,题为“NiuTrans: 一套开源的统计机器翻译平台”,仔细读了一下,觉得这句话很有分量:“内部测试结果显示性能和速度稳定优于Moses”,如果读者感兴趣,可以去NiuTrans的主页去申请下载,做个测试,NiuTrans的主页见:http://www.nlplab.com/NiuPlan/NiuTrans.html。前不久“哈工大语言技术平台(LTP)源代码正式对外共享”,而今东北大学也开源了NiuTrans这套统计机器翻译平台,这些对于致力于中文信息处理的NLPer来说都是好消息。以下内容全文转载自朱靖波老师的邮件:

各位老师,大家好!

我们实验室经过多个月的努力,NiuPlan的第一个NiuTrans系列系统-基于短语的统计机器翻译系统终于打包成功,Alpha版源代码正式对外免费发布,目前访问入口显示在我们实验室网站(http://www.nlplab.com)首页左上角。网页上提供了详细的使用说明和高级参数设置方法,并且还提供了部分样本数据用于学习如何使用NiuTrans. 内部测试结果显示性能和速度稳定优于Moses.系统代码的下载方式非常简单,在注册页输入姓名和电子邮件,即可得到动态下载的链接。建议提供正确的电子邮件,这样以后可以随时得到NiuPlan的最新发布和更新信息。

计划一年之内,我们实验室将不断推出NiuPlan不同系列的开源系统,包括Hierarchical phrase-based model,Syntax-based model (string-to-tree/tree-to-string/tree-to-tree)和基于统计的句法分析系统开源平台等。

NiuPlan最终将推出四个系列的开源平台系统:NiuTrans, NiuParser, NiuMining, and NiuKnowledge(暂定名字)系列系统.欢迎同行们免费下载使用,并能够将宝贵建议及时反馈给我们,我们承诺将尽力尽快完善NiuPlan各系列开源系统,在此感谢各位的使用和对现有Bug的容忍。所有系统可以从我们实验室网站上获取.祝好!

Best regards,

Dr. Jingbo Zhu (朱靖波)
Professor(PhD Supervisor), Director
Natural Language Processing Laboratory
Northeastern University
Shenyang, Liaoning, P.R.China
Phone: 0086-24-83672481 (O)(Fax)
Email: zhujingbo at mail.neu.edu.cn
Homepage: http://www.nlplab.com/members/zhujingbo.html

继续阅读