知识图谱学习(一):知识提取

一. 正则表达式

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和神经网络模型
待补充.

猜你喜欢

转载自blog.csdn.net/juranyaoyingwen/article/details/80173687
今日推荐