欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-12 17:05:26
...

一. 正则表达式

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