周生生,实战共享之专业范畴词汇无监督发掘,老鹰

admin 6个月前 ( 04-18 00:39 ) 0条评论
摘要: 实战分享之专业领域词汇无监督挖掘...

作者丨苏剑林

单位丨广州火焰信息科技有限公司

研讨方向丨NLP,神经网络

个人主页丨kexue.fm

上一年 Data Fountain 曾举办了一个“电力专业领域词汇开掘”的竞赛,该竞赛有意思的当地在于它是一个“无监督”的竞赛,也便是说它检测的是从很多的语猜中无监督开掘专业词汇的才干。

大赛主页:

https://www.datafountain.cn/competitions/320/details

这个确实是工业界比较有价值的一个才干,又想着我之前也在无监督新词发现中做过必定的研讨,加之“无监督竞赛”的新颖性,所以其时毫不犹豫地参加了,可是终究排名并不靠前。

不管怎样,仍是同享一下我自己的做法,这是一个真实含义上的无监督做法,或许会对部分读者有些参阅价值。

基准比照

首要,新词发现部分,用到了我自己写的库 NLP Zero,基本思路是先分别对“竞赛所给语料”、“自己爬的一部分百科百科语料”做新词发现,然后两吸精者进行比照,就能找到一批“竞赛所给语料”的特征词。

NLP Zero:

周生生,实战同享之专业领域词汇无监督开掘,老鹰
金碗共赢

https://kexue.fm/archives/5597

参阅的源码是:

fromnlp_zero import*

importre

importpandas aspd

importpymongo

importlogging

logging.basicConfig(level = logging.INFO, format = '%(asctime)s - %(name)s - %(message)s')

classD:# 读取竞赛方所给语料

def__iter__(self):

withopen( 'data.txt')周生生,实战同享之专业领域词汇无监督开掘,老鹰 asf:

forl inf:

l = l.strip().decode( 'utf-8')

l = re.sub( u'[^u4e00-u9fa5]+', ' ', l)

yieldl

classDO:# 读取自己的语料(相当于平行语料)

def__iter__(self):

db = pymongo.MongoClient().baike.items

fori indb.find().limit( 300000):

l = i[ 'content']

l = re.sub( u'[^u4e00-u9fa5]+', ' ', l)

yieldl

# 在竞赛方语猜中做新词发现

f = Word_Finder(min_proba= 1e-6, min_pmi= 0.5)

f.train(D()) # 核算互信息

f.find(D()) # 构建词库

# 导出词表

words = pd.Series(f.words).sort_values(ascending= False)

# 在自己的语猜中做新词发现

fo = Word_Finder(min_proba= 1e-6, min_pmi= 0.5)

fo.train(DO(胸好涨老公)) # 核算互信息

fo.find(DO()) # 构建词库

# 导出词表

other_words = pd.Series(fo.words).sort_values(ascending= False)

other_words = other_words / other_words.sum() * words.sum() # 总词频归一化(这样才便于比照)

"""比照两份语料词频,得到特征词。

比照方针是(竞赛方语料的词频 + alpha)/(自己语料的词频 + beta);

alpha和beta的核算参阅自 http://www.matrix67.com/blog/archives/5044

"""

WORDS = words.copy()

OTHER_WORDS = other_words.copy()

total_zeros = (WORDS + OTHER_WORDS).fillna( 0) * 0

words = WORDS + total_zeros

other_words = OTHER_WORDS + total_zeros

total = words + ot性美国her_words

alpha = words.sum() / total.sum()

result = (words + total.mean() * alpha) / (total + total.mean())

result = result.sort_values(ascending= False)

idxs = [i fori inresult.index iflen(i) >= 2] # 排除去单字词

# 导出csv格局

pd.Series(idxs[: 20000]).to_csv( 'result_1.csv', encoding= 'utf-8', header= None, index= None)

语义挑选

注意到,依照周生生,实战同享之专业领域词汇无监督开掘,老鹰上述方法导出来的词表,顶多算是“语料特征词”,可是还不完全是“电力专业领域词汇”。假如着眼于电力词汇,那么性快感需求对词表进模仿航船2006行语义上的挑选。

我的做法是:用导出来的词表对竞赛语料进行分词,然后练习一个 Word2Vec 模型,依据 Word2Vec 得到的词向量来对词进行聚类。

首要是练习 Word2Vec:

# nlp zero供给了杰出的封装,能够直到导洞房花烛夜整蛊新娘出一个分词器,词表是新词发现得到的词表。

tokenizer = f.export_tokenizer()

classDW:

def__iter__(self):

forl inD()蜜桃汇:

yieldtokenizer.tokenize(l, combine_Aa123= False)

fromgensim.models importWord2Vec

word_size = 100

word2vec = Word2Vec(DW(), size=word_size, min_count= 2, sg= 1, negative= 10)

然后是聚类,不过这不是严厉含义上的聚类,而是依据咱们自己跳出来的若干个种子词,然后找到一批类似词来。算法是用类似的传递性(有点类似依据连通性的聚类算法),即 A 和 B 类似,B 和 C也类似,那么 A、B、C 就聚为一类(哪怕A、C从方针上看是不类似的)。

当然,这样传递下去很可能把整个词表都遍历了,所以要逐渐加强对类似的约束。比方 A 是种子词,B、C 都不是种子词,A、B 的类似度为 0.6 就界说它为类似,B、C 的类似度要大于 0.7 才干以为它们类似,否则这样一级级地传递下去,后边的词就会离种子词的语义越来越远。

聚类算法如下:

importnumpy asnp

frommultiprocessing.dummy importQueue

defmost_similar(word, center_vec=None, neg_vec=None):

"""依据给定词、中心向量和负向量找最邻近的词

"""

vec = word2vec[word] + center_vec - neg_vec

returnword2vec.similar_by_vector(vec, topn= 200)徐僖

deffind_words(start_words, center_words=None, neg_words=None, min_sim=0.6, max_sim=1., alpha=0.25):

ifcenter_words == Noneandneg_words == None:

min_sim = max(min_sim, 0.6)

center_vec, neg_vec = np.zeros([word_size]), np.zeros([word_size])

ifcenter_words: # 中心向量是一切种子词向量的均匀

_ = 0

forw incenter_words:

ifw inword2vec.wv.vocab:

center_vec += word2vec[w]

_ += 1

红烧鸡肝

if_ > 0:

center_vec /= _

ifneg_words: # 负向量是一切负种子词向量的均匀(本文没有用到它)

_ = 0

forw inneg_words:

ifw inword2vec.wv.vocab:

neg_vec += word2vec[w]

_ += 1

if_ > 0:

neg_vec /= _

queue_count = 1

task_count = 0

cluster = []

queue = Queue() # 树立行列

forw instart_words:

queue.put(( 0,unnies w))

ifw notincluster:

cluster.append(w)

whilenotqueue.empty():

idx, word = queue.get()

queue_count -= 1

task_count += 1

sims = most_similar(word, center_vec, neg_vec)

min_sim_ = min_sim + (max_sim-mi周生生,实战同享之专业领域词汇无监督开掘,老鹰n_sim) * ( 1-np.exp(-alpha*idx))

iftask_count % 10== 0:

log = '%s in cluster, %s in queue, %s tasks done, %s min_sim'%(len(cluster), queue_count, task_count, min_sim_)

printlog

fori,j insims:

ifj >= min_sim_:

ifi notincluster andis_good(i): # is_good是人工写的过滤规矩

queue.put((idx+ 1, i))

ifi notincluster andis_good(i):

cluster.append(i)

queue_count += 1

returncluster

规矩过滤

总的来说,无监督算法始终是难以做到完美的,在工程上,常见的方法便是人工调查成果然后手写一些规矩来处理。在这个使命中,因为前面是纯无监督的,哪怕进行了语义聚类,仍是会出来一些非电力专业词汇(比方“麦克斯韦方程”),乃至还保存一些“非词”,所以我写了一通规矩来过滤(写得有点丑):

defis_good(w):

ifre.findall( u'[u4e00-u9布什卖热狗fa5]', w)

andlen(i) >= 2

andnotre.findall( u'[较很越增]|[多少巨细长短凹凸好差]', w)

andnotu'的'inw

andnotu'了'inw

andnotu'这'inw

andnotu'那'inw

andnotu'到'inw

andnotw[ -1] inu'为一人给内里后省市局院上地点有与及厂稿下厅部商者从奖出'

andnotw[ 0] inu'每各该个被其从与及当为'

andnotw[ -2:] in[ u'问题', u'商场', u'邮件', u'合约', u'假定周生生,实战同享之专业领域词汇无监督开掘,老鹰', u'编号', u'预算', u'施加', u'战略', u'状况', u'作业', u'查核', u'评北京新风机械厂估', u'需求', u'交流', u'阶段', u'账号', u'认识', u'价值', u'事端', u'竞赛', u'买卖', u'趋势', u'主任', u'价格', u'门户', u'治区', u'培育廖嘉欣', u'职责', u'社会', u'主义', u'方法', u'干部', u'员会', u'商务', u'开展', u'原因', u'状况', u'国家', u'园区', u'同伴', u'对手', u'方针', u'委员', u'人员', u'如下', u'况下', u'见图', u'全国', u'立异', u'同享', u'资讯', u'部队', u'乡村', u'奉献', u'争力', u'区域', u'客户', u'领域', u'查询', u'使用', u'能够', u'运营', u'成员', u'书记', u'邻近', u'成果', u'司理', u'学位', u'运营', u'思维', u'监管', u'才干', u'职责', u'定见', u'精力', u'说话', u'营销', u'事务', u'总裁', u'见表', u'电力', u'主编', u'作者', u'专辑', u'学报', u'创立', u'支撑', u'赞助', u'规划', u'方案', u'周生生,实战同享之专业领域词汇无监督开掘,老鹰资金', u'代表', u'部分', u'版社', u'标明', u'证明', u'专家', u'教授', u'教师', u'基金', u'如图', u'坐落', u'从事', u'公司', u'企业', u'专业', u'思路', u'集团', u'建造', u'办理', u'水平', u'领导', u'体系', u'政务', u'单位', u'部分', u'董事', u'院士', u'经济', u'含义', u'内部', u'项目', u'建造', u'效劳', u'总部', u'办理', u'评论', u'改善', u'文献']

andnotw[: 2] in[ u'考虑', u'图中', u'每个', u'到会', u'一个', u'跟着', u'不会', u'本次', u'发生', u'查询', u'是否', u'作者']

andnot( u'博士'inw oru'硕士'inw oru'研讨生'inw)

andnot(len(set(w)) == 1andlen(w) > 1)

andnot(w[ 0] inu'一二三四五六七八九十'andlen(w) == 2)

andre.findall( u'[^一七厂月二夕气产兰丫田洲户尹尸甲乙日卜几口工旧门目曰石闷匕勺]', w)

a芳芳的美好ndnotu'进一步'inw:

returnTrue

else:

returnFalse

至此,咱们就能够完整地履行这个算法了:

# 种子词,在第一步得到的词表中的前面部分挑一挑即可,不需求特别准

start_words = [ u'电网', u'电压', u'直流', u'电力体系', u'变压器', u'电流', u'负荷', u'发电机', u'变电站', u'机组', u'母线', u'电容', u'放电', u'等效', u'节点', u'电机', u黄潇吴昕'毛病', u'输电线路', u'波形', u'电感', u'导线', u'继电', u'输电', u'参数', u'无功', u'线路', u'仿真', u'功率', u'短路', u'操控器', u'谐波', u'励磁', u'电阻', u'模型', u'开关', u'绕组', u'电力', u'电厂', u'算法', u'供电', u'阻抗', u'调度', u'发电', u'场强', 深呼锡u'电源', u'负载', u'扰动', u'储能', u'电弧', u'配电', u'系数', u'雷电', u'输出', u'并联', u'回路', u'滤波器', u'电缆', u'分布式', u'毛病诊断', u'充电', u'绝缘', u'接地', u'感应', u'额外', u'高压', u'相位', u'可靠性', u'数学模型', u'接线', u'稳态', u周生生,实战同享之专业领域词汇无监督开掘,老鹰'差错', u'电场强度', u'电容器', u'电场', u'线圈', u'非线性', u'接入', u'模态', u'神经网络', u'频率', u'风速', u'小波', u'补偿', u'电路', u'曲线', u'峰值', u'容量', u'有效性', u'采样', u'信号', u'电极', u'实测', u'变电', u'空隙', u'模块', u'实验', u'滤波', u'量测', u'元件', u'最优', u'损耗', u'特性', u'谐振', u'带电', u'瞬时', u'阻尼', u'转速', u'优化', u'低压', u'体系', u'停电', u'选取', u'传感器', u'耦合', u'振动', u'线性', u'信息体系', u'矩阵', u'可控', u'脉冲', u'操控', u'套管', u'监控', u'汽轮机', u'击穿', u'延时', u'联络线', u'矢量', u'整流', u'传输', u'检修', u'模仿', u'高频', u'丈量', u'样本', u'高级工程师', u'改换', u'试样', u'实验研讨', u'均匀值', u'向量', u'特征值', u'导体', u'电晕', u'磁通', u'千伏', u'切换', u'呼应', u'功率']

cluster_words = find_words(start_words, min_sim= 0.6, alpha= 0.35)

result2 = result[cluster_words].sort_values(ascending= False)

idxs = [i fori inresult2.index ifis_good(i)]

pd.Series([i fori inidxs iflen(i) > 2][: 10000]).to_csv( 'result_1_2.csv', encoding= 'utf-8', header= None, index= None)

终究成果(部分):

变压器

发电机

变电站

过电压

可靠性

操控器

断路器

分布式

输电线路

数学模型

滤波器

电容器

毛病诊断

神经网络

直流电压

等离子体

联络线

传感器

汽轮机

晶闸管

电动机

约束条件

数据库

可行性

持续时间

整流器

稳定性

调节器

电磁场

跋文感触

本文的算法在榜上的成果大约是 0.22 左右,封榜时排在 100 名左右,第一已经是 0.49 了,所以从成果来看其实没什么值得夸耀的。不过其时传闻不少人拿现成的专业词典去做字标示,所以其时就没做下去了。要是真的那姿态的话,我觉得就很没意思了。

总归,本文算是供给了一个无监督抽取洪相熙专业词的完成模版,假如读者觉得有可取之处,大方取之即可;假如觉得一无可取,敬请无视它。

点击以下标题检查作者其他文章:

#

• 稿件确系个人原创造青鲷品,来稿需注明作者个人信息(名字+校园/作业单位+学历/职位+研讨方向)

• PaperWeekly 默许每篇文章都是首发,均会增加“原创”标志

关于PaperWeekly

声明:该文观念仅代表作者自己,搜狐号系信息发布渠道,搜狐仅供给信息存储空间效劳。
文章版权及转载声明:

作者:admin本文地址:http://www.tianjinnew.cn/articles/945.html发布于 6个月前 ( 04-18 00:39 )
文章转载或复制请以超链接形式并注明出处竞技宝app_竞技宝app下载_竞技宝app下载安装