一、在java 中怎么调用 PullWord (http://api.pullword.com/) 分词接口
先说个通知,去年加入社交数据会员的同学们,数据都已经发给你们了,希望对大家的科研有帮助。 如果没收到邮件,请和我联系。
今天一个朋友来信,说我开放的那个分词,不支持跨域访问,需要在php中加这么一句:header("Access-Control-Allow-Origin: *");。加上后,他说可以了,我其实对php完全不懂,也不知道这是啥,其实分词我也是门外汉,我这个也没有用语言模型那套东西,完全走了另外一条路。
最开始pullword分词还很初级,本质上没有分词能力,就是把一句话切成两两,三三的string。比如“清华大学”构造出:“清华,华大,清华大,华大学,清华大学” 这样几个string。很显然里面“华大学”不是一个词。但是把这个揉到聚类中,聚出类后,会发现这些“烂词”在很多性质上很特别,比如在类上的分布。比如和清华大学在类分布上的相似性,用一些简单的规则可以砍掉很多词。。请注意到目前为止,我并没有利用词典来判断“华大学”不是一个词,而是根据一些结构性信息来做出“华大学”不是一个词。这样反复redo这个“切分词->;聚类->;得到烂词->;改进且分词的能力”过程,最后通过类的信息可以构造出一个不错的字典。后来我发现了这个方法在行业语料和电商语料上“构建”了非常大的词库,并开始组建团队开始了词库创业之旅,虽然没有融到一毛钱,唯一一个老板愿意出资5万元,占股8%,我想也没想就拒绝了。
很快挣到了一些钱,很多搞SEO,搞爬虫的找我买词库,对他们来说一个全的词库太重要了,原因大家都懂,我就不深入解释了。词库这个生意很难维持,这是因为买了词库的人,不会再买了,因为词的变化是比较少的,新词每年也就涌现有限的一点,这个生意失败后,我也就沉寂了。
直到有一天某大佬找我,说你搞这么大词库,分词行不行?我开始琢磨有了词库怎么做分词,当时一批搞机器学习的人在我身边经常交流,有一天我突然考虑了一种方法来把一句话中可能成词的每个词都用一种能量模型来进行概率量化,常识了下效果居然很好,后来有用了一些trick来让结果更稳定,比如正则化,比如随机drop一些梯度更新等等。在我的自动评分中从80分左右提高到了95分。当然这和很多分词软件提到的准确率99.99%还有距离,但是这些分词软件大部分在人民日报语料上做的,而不是在微博和贴吧这种大众化语料上做的,所以不需要多大词库也能做到很好的效果。
后来我把这个工具拿给这个大佬单位用,他给了我一笔经费(记得是2万元)。后来他说,你这个效果不错,干脆开放给社会吧。我在微信朋友圈提了这个想法,fenng马上就赞助了第一个月的费用,那会性能还不行,需要每个月1000多元来跑这个服务。后来陆续不少人赞助,直到美团云给了3.7万元,才结束了四处乞讨的生活。
快毕业的时候百度API store把pullword收录进去,目前从百度这个渠道已经累计调用3200万次,现在每天的请求也过200万次,有时候能达到400多万次,成为了一个服务社会的小产品。
后来有人问我为什么你不把语言模型和能量方程的方法结合起来,也许更好呢?语言模型的方法我觉得已经有人走的很深入了,用一个特别语言的路子解决语言问题可能并不对。而用一个不是那么语言的路子解决语言问题也不一定对,但起码值得探索。
pullword可能是我博士生涯对社会最重要的贡献,希望能为社会的进步出一份小小的力量。
二、如何对excel表格里的词结巴分词python
# -*- coding: utf-8 -*- import jieba ''''' Created on 2015-11-23 ''' def word_split(text): """ Split a text in words. Returns a list of tuple that contains (word, location) location is the starting byte position of the word. """ word_list = [] windex = 0 word_primitive = jieba.cut(text, cut_all = True) for word in word_primitive: if len(word) > 0: word_list.append((windex, word)) windex += 1 return word_list def inverted_index(text): """ Create an Inverted-Index of the specified text document. {word:[locations]} """ inverted = {} for index, word in word_split(text): locations = inverted.setdefault(word, []) locations.append(index) return inverted def inverted_index_add(inverted, doc_id, doc_index): """ Add Invertd-Index doc_index of the document doc_id to the Multi-Document Inverted-Index (inverted), using doc_id as document identifier. {word:{doc_id:[locations]}} """ for word, locations in doc_index.iteritems(): indices = inverted.setdefault(word, {}) indices[doc_id] = locations return inverted def search_a_word(inverted, word): """ search one word """ word = word.decode('utf-8') if word not in inverted: return None else: word_index = inverted[word] return word_index def search_words(inverted, wordList): """ search more than one word """ wordDic = [] docRight = [] for word in wordList: if isinstance(word, str): word = word.decode('utf-8') if word not in inverted: return None else: element = inverted[word].keys() element.sort() wordDic.append(element) numbers = len(wordDic) inerIndex = [0 for i in range(numbers)] docIndex = [wordDic[i][0] for i in range(numbers)] flag = True while flag: if min(docIndex) == max(docIndex): docRight.append(min(docIndex)) inerIndex = [inerIndex[i]+1 for i in range(numbers)] for i in range(numbers): if inerIndex[i] >= len(wordDic[i]): flag = False return docRight docIndex = [wordDic[i][inerIndex[i]] for i in range(numbers)] else: minIndex = min(docIndex) minPosition = docIndex.index(minIndex) inerIndex[minPosition] += 1 if inerIndex[minPosition] >= len(wordDic[minPosition]): flag = False return docRight docIndex = [wordDic[i][inerIndex[i]] for i in range(numbers)] def search_phrase(inverted, phrase): """ search phrase """ docRight = {} temp = word_split(phrase) wordList = [temp[i][1] for i in range(len(temp))] docPossible = search_words(inverted, wordList) for doc in docPossible: wordIndex = [] indexRight = [] for word in wordList: wordIndex.append(inverted[word][doc]) numbers = len(wordList) inerIndex = [0 for i in range(numbers)] words = [wordIndex[i][0] for i in range(numbers)] flag = True while flag: if words[-1] - words[0] == numbers - 1: indexRight.append(words[0]) inerIndex = [inerIndex[i]+1 for i in range(numbers)] for i in range(numbers): if inerIndex[i] >= len(wordIndex[i]): flag = False docRight[doc] = indexRight break if flag: words = [wordIndex[i][inerIndex[i]] for i in range(numbers)] else: minIndex = min(words) minPosition = words.index(minIndex) inerIndex[minPosition] += 1 if inerIndex[minPosition] >= len(wordIndex[minPosition]): flag = False break if flag: words = [wordIndex[i][inerIndex[i]] for i in range(numbers)] return docRight if __name__ == '__main__': doc1 = """ 中文分词指的是将一个汉字序列切分成一个一个单独的词。
分词就是将连续的字序列按照一定的规范 重新组合成词序列的过程。我们知道,在英文的行文中,单词之间是以空格作为自然分界符的,而中文 只是字、句和段能通过明显的分界符来简单划界,唯独词没有一个形式上的分界符,虽然英文也同样 存在短语的划分问题,不过在词这一层上,中文比之英文要复杂的多、困难的多。
""" doc2 = """ 存在中文分词技术,是由于中文在基本文法上有其特殊性,具体表现在: 与英文为代表的拉丁语系语言相比,英文以空格作为天然的分隔符,而中文由于继承自古代汉语的传统, 词语之间没有分隔。 古代汉语中除了连绵词和人名地名等,词通常就是单个汉字,所以当时没有分词 书写的必要。
而现代汉语中双字或多字词居多,一个字不再等同于一个词。 在中文里,“词”和“词组”边界模糊 现代汉语的基本表达单元虽然为“词”,且以双字或者多字词居多,但由于人们认识水平的不同,对词和 短语的边界很难去区分。
例如:“对随地吐痰者给予处罚”,“随地吐痰者”本身是一个词还是一个短语,不同的人会有不同的标准, 同样的“海上”“酒厂”等等,即使是同一个人也可能做出不同判断,如果汉语真的要分词书写,必然会出现 混乱,难度很大。 中文分词的方法其实不局限于中文应用,也被应用到英文处理,如手写识别,单词之间的空格就不很清楚, 中文分词方法可以帮助判别英文单词的边界。
""" doc3 = """ 作用 中文分词是文本挖掘的基础,对于输。
三、word分词器分的词怎么都是一个词
我们知道,Word中的words对象是Word可以识别的词语,对于汉语词语来说,有的词语和我们的习惯并不完全相符。简单的说就是有的词语在Word
中被认为是一个词语,如 阿波罗 ,有的词语被识别为多个词语,如 一字之差
。这样的差别就是Word在分词方面的bug。下面就谈谈如何实现对Word汉语分词自定义。
首先特别要感谢Excelhome论坛sylun兄。之前我还一直固执地认为Word只支持导入英文词典,对于中文词语不支持自定义,是这位哥哥告诉我,可以通过导入微软拼音输入法自造词实现自定义分词效果。我的工作其实就是想办法把这个效果的实现更简单一些:不再必须安装庞大的微软拼音输入法,且一经导入制作的自造词在用户间可以简单实现通用。
效果如下:
1、首先不做任何操作,打开测试文档,点击“统计每段词语数”看看结果。不保存关闭文档。
2、运行Word自造词工具.exe,点击修改按钮。
3、再次打开测试文档,点击“统计每段词语数”看看结果。两次结果是否相同。
原来每一段都被自定义成了一个词语。(回车符除外)
四、java程序:从一篇语料中提取所有的以'/'为结束的中文分词,并将统计
package com.jy.test.alltest;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;public class Test { /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { System.out.println("请输入语料文件路径名:"); Scanner sc = new Scanner(System.in); String fileName= sc.nextLine();// File fileName = new File("c:\\wj.txt"); 这个是测试时用的语料文件,非用户输入 BufferedReader reader = new BufferedReader(new FileReader(fileName)); BufferedWriter bw =new BufferedWriter(new FileWriter("c:\\news.txt"));//默认文件写入C盘下的TXT文档中,如需修改,改变路径即可。
String line; while( ( line=reader.readLine() )!=null ){ String[] s1 = line.split(" "); for (int i = 0; i < s1.length;="" i++)="" {="" string[]="" s2="s1[i].split("/");" system.out.println(s2[0]);="" bw.write(s2[0]);="" }="" }="" reader.close();="" bw.close();="">
转载请注明出处51数据库 » word分词之后的语料