知識圖譜學習(一):知識提取

一. 正則表達式

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和神經網絡模型
待補充.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章