知识图谱学习(一):知识提取
一. 正则表达式
1.1 Python re
1.1.1 regex语法
推荐网站http://pythex.org/,不但有语法,还可以在线测试
1.1.2 match匹配模式
re.match(pattern,string,flags)尝试从字符串的开始匹配一个模式,flags是匹配模式,可以使用按位或’|’表示同时生效,也可以在正则表达式字符串中指定。
1).re.I(re.IGNORECASE): 忽略大小写
2).re.M(MULTILINE): 多行模式,改变’^’和’$’的行为
3).re.S(DOTALL): 点任意匹配模式,改变’.’的行为
4).re.L(LOCALE): 使预定字符类 \w \W \b \B \s \S 取决于当前区域设定
5).re.U(UNICODE): 使预定字符类 \w \W \b \B \s \S \d \D 取决于unicode定义的字符属性
1.1.3 search匹配模式
若string中包含pattern子串,则返回Match对象,否则返回None,注意,如果string中存在多个pattern子串,只返回第一个。
1.1.4 group提取数据
二.分词和词性标注
分词也是后续处理的基础。分词做得好,核心秘密在词库,算法的影响反而不太大。分词是会出错的。不过有些场合(比如检索排序),只要错误是一贯的,影响也不是太大。分词后面可以用规则来弥补。工程上很丑陋,上不了台面,但对早期的小项目可能够用了。
推荐工具: jieba/PyNLPIR/Hanlp
2.1用jieba分词和提取词性
2.1.1 jieba.cut
方法接受三个输入参数: 需要分词的字符串;cut_all 参数用来控制是否采用全模式;HMM 参数用来控制是否使用 HMM 模型
2.1.2 jieba.cut_for_search
方法接受两个参数:需要分词的字符串;是否使用 HMM 模型。该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细
2.1.3 jieba.cut 以及 jieba.cut_for_search
返回的结构都是一个可迭代的 generator,可以使用 for 循环来获得分词后得到的每一个词语(unicode),或者用jieba.lcut 以及 jieba.lcut_for_search 直接返回 list
jieba.Tokenizer(dictionary=DEFAULT_DICT) 新建自定义分词器,可用于同时使用不同词典。jieba.dt 为默认分词器,所有全局分词相关函数都是该分词器的映射。
2.2 添加词典
2.2.1 jieba.load_userdict(file_name)
#file_name 为文件类对象或自定义词典的路径,词典格式和 dict.txt 一样,一个词占一行;每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。file_name 若为路径或二进制方式打开的文件,则文件必须为 UTF-8 编码。词频省略时使用自动计算的能保证分出该词的词频。
2.2.2 使用 add_word(word, freq=None, tag=None) 和 del_word(word)
可在程序中动态修改词典。使用 suggest_freq(segment, tune=True) 可调节单个词语的词频,使其能(或不能)被分出来。jieba 分词前需要建立一个Trie 树字典来帮助其分词
2.3 词性标注
2.3.1 jieba.posseg.POSTokenizer(tokenizer=None)
新建自定义分词器,tokenizer 参数可指定内部使用的 jieba.Tokenizer 分词器。jieba.posseg.dt 为默认词性标注分词器。标注句子分词后每个词的词性,采用和 ictclas (中科院分词)兼容的标记法。
2.3.2 并行分词:jieba.enable_parallel()
2.4 关键词提取
2.4.1 jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
默认每行为一个文件(跟读取方式有关)
关键词提取所使用逆向文件频率(IDF)文本语料库可以切换成自定义语料库的路径
jieba.analyse.set_idf_path(file_name) # file_name为自定义语料库的路径
关键词提取所使用停止词(Stop Words)文本语料库可以切换成自定义语料库的路径
jieba.analyse.set_stop_words(file_name) # file_name为自定义语料库的路径
jieba.analyse.TFIDF(idf_path=None) 新建 TFIDF 实例,idf_path 为 IDF 频率文件
2.4.2 jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=(‘ns’, ‘n’, ‘vn’, ‘v’))
直接使用,接口相同,注意默认过滤词性。jieba.analyse.TextRank() 新建自定义 TextRank 实例
ws = defaultdict(float)
outSum = defaultdict(float)
wsdef = 1.0 / (len(self.graph) or 1.0)
for n, out in self.graph.items():
ws[n] = wsdef
outSum[n] = sum((e[2] for e in out), 0.0)
# this line for build stable iteration
sorted_keys = sorted(self.graph.keys())
for x in xrange(10): # 10 iters
for n in sorted_keys:
s = 0
for e in self.graph[n]:
s += e[2] / outSum[e[1]] * ws[e[1]]
ws[n] = (1 - self.d) + self.d * s
(min_rank, max_rank) = (sys.float_info[0], sys.float_info[3])
for w in itervalues(ws):
if w < min_rank:
min_rank = w
if w > max_rank:
max_rank = w
for n, w in ws.items():
# to unify the weights, don't *100.
ws[n] = (w - min_rank / 10.0) / (max_rank - min_rank / 10.0)
return ws
ws[n]为weight_sum表示单词n的权重,outsum[n]为从单词n到其他单词的权重的和,graph[n]表示[(n,n’,weight)]的list,n’为其他单词.根据jieba源码,窗口大小为5,只考虑单向(n’出现在n后面5个单词内).
三.命名实体识别
命名实体识别(Named Entity Recognition,简称NER),又称作“专名识别”,是指识别文本中具有特定意义的实体,主要包括人名、地名、机构名、专有名词等。
Stanford NLP小组提供了大量NLP相关的工具,github上还有相关Python接口.
主要的方法有早期的基于字典和规则的方法,到传统机器学习的HMM,MEMM,CRF,再到深度学习的NN/CNN-CRF,RNN-CRF,到最近的基于Attention,迁移学习,半监督学习的方法.
这里主要需要掌握的是CRF和神经网络模型
待补充.
上一篇: php更新mysql后获取影响的行数发生异常解决方法_php技巧
下一篇: 知识图谱(一)-基本概念