成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【手撕 - 自然語(yǔ)言處理】手撕 TextRank(01)大佬是怎么實(shí)現(xiàn) Python 版的

JerryC / 1511人閱讀

摘要:開(kāi)撕文件夾下的程序展示了怎么使用這個(gè)版本的。文件行數(shù)這句是重點(diǎn)摘要然后,我們知道重點(diǎn)函數(shù)是,我們?cè)賮?lái)看它是怎么工作的。再仔細(xì)閱讀一遍,原來(lái)寫這個(gè)庫(kù)的大佬用種不同的方法實(shí)現(xiàn)了個(gè)函數(shù),請(qǐng)收下我的膝蓋。

作者:LogM

本文原載于 https://segmentfault.com/u/logm/articles ,不允許轉(zhuǎn)載~

1. 源碼來(lái)源

TextRank4ZH 源碼:https://github.com/letiantian/TextRank4ZH.git

本文對(duì)應(yīng)的源碼版本:committed on 3 Jul 2018, fb1339620818a0b0c16f5613ebf54153faa41636

TextRank 論文地址:https://www.aclweb.org/anthology/W04-3252

2. 概述

letiantian 大佬的這個(gè)版本,應(yīng)該是所有 TextRank 的 Python 版本中被點(diǎn)贊最多的。代碼寫的也非常的簡(jiǎn)單易懂。

3. 開(kāi)撕

example 文件夾下的程序展示了怎么使用這個(gè)版本的 TextRank。有關(guān)鍵詞、關(guān)鍵短語(yǔ)、關(guān)鍵句抽取三種功能,我們這邊只關(guān)注關(guān)鍵句的抽取。

應(yīng)該很容易看懂吧,先實(shí)例化 TextRank4Sentence,然后使用 analyze 抽取。

# 文件:example/example1.py
# 行數(shù):28
tr4s = TextRank4Sentence()
tr4s.analyze(text=text, lower=True, source = "all_filters") # 這句是重點(diǎn)

print()
print( "摘要:" )
for item in tr4s.get_key_sentences(num=3):
    print(item.index, item.weight, item.sentence)

然后,我們知道重點(diǎn)函數(shù)是 analyze,我們?cè)賮?lái)看它是怎么工作的。

# 文件:textrank4zh/TextRank4Sentence.py
# 行數(shù):43
def analyze(self, text, lower = False, 
              source = "no_stop_words", 
              sim_func = util.get_similarity,
              pagerank_config = {"alpha": 0.85,}):
        """
        Keyword arguments:
        text                 --  文本內(nèi)容,字符串。
        lower                --  是否將文本轉(zhuǎn)換為小寫。默認(rèn)為False。
        source               --  選擇使用words_no_filter, words_no_stop_words, words_all_filters中的哪一個(gè)來(lái)生成句子之間的相似度。
                                 默認(rèn)值為`"all_filters"`,可選值為`"no_filter", "no_stop_words", "all_filters"`。
        sim_func             --  指定計(jì)算句子相似度的函數(shù)。
        """
        
        self.key_sentences = []
        
        result = self.seg.segment(text=text, lower=lower)
        self.sentences = result.sentences
        self.words_no_filter = result.words_no_filter
        self.words_no_stop_words = result.words_no_stop_words
        self.words_all_filters   = result.words_all_filters

        options = ["no_filter", "no_stop_words", "all_filters"]
        if source in options:
            _source = result["words_"+source]
        else:
            _source = result["words_no_stop_words"]

        # 這句是重點(diǎn)
        self.key_sentences = util.sort_sentences(
              sentences = self.sentences,
              words     = _source,
              sim_func  = sim_func,
              pagerank_config = pagerank_config)

很容易發(fā)現(xiàn),我們需要的內(nèi)容在 util.sort_sentences 這個(gè)函數(shù)里。

# 文件:textrank4zh/util.py
# 行數(shù):169
def sort_sentences(sentences, words, sim_func = get_similarity, pagerank_config = {"alpha": 0.85,}):
    """將句子按照關(guān)鍵程度從大到小排序

    Keyword arguments:
    sentences         --  列表,元素是句子
    words             --  二維列表,子列表和sentences中的句子對(duì)應(yīng),子列表由單詞組成
    sim_func          --  計(jì)算兩個(gè)句子的相似性,參數(shù)是兩個(gè)由單詞組成的列表
    pagerank_config   --  pagerank的設(shè)置
    """
    sorted_sentences = []
    _source = words
    sentences_num = len(_source)        
    graph = np.zeros((sentences_num, sentences_num))
    
    for x in xrange(sentences_num):
        for y in xrange(x, sentences_num):
            similarity = sim_func( _source[x], _source[y] ) # 重點(diǎn)1
            graph[x, y] = similarity
            graph[y, x] = similarity
            
    nx_graph = nx.from_numpy_matrix(graph)
    scores = nx.pagerank(nx_graph, **pagerank_config)  # 重點(diǎn)2
    sorted_scores = sorted(scores.items(), key = lambda item: item[1], reverse=True)

    for index, score in sorted_scores:
        item = AttrDict(index=index, sentence=sentences[index], weight=score)
        sorted_sentences.append(item)

    return sorted_sentences

這邊有兩個(gè)重點(diǎn),重點(diǎn)1:句子與句子的相似度是如何計(jì)算的;重點(diǎn)2:pagerank的實(shí)現(xiàn)。

很明顯,PageRank 的實(shí)現(xiàn)是借助了 networkx 這個(gè)第三方庫(kù),在下一節(jié)我們會(huì)來(lái)看看這個(gè)第三方庫(kù)的源碼。

這邊,我們先來(lái)看重點(diǎn)1,句子與句子的相似度是如何計(jì)算的,容易看出,計(jì)算方式和論文給的公式是一致的。

# 文件:textrank4zh/util.py
# 行數(shù):102
def get_similarity(word_list1, word_list2):
    """默認(rèn)的用于計(jì)算兩個(gè)句子相似度的函數(shù)。

    Keyword arguments:
    word_list1, word_list2  --  分別代表兩個(gè)句子,都是由單詞組成的列表
    """
    words   = list(set(word_list1 + word_list2))        
    vector1 = [float(word_list1.count(word)) for word in words]
    vector2 = [float(word_list2.count(word)) for word in words]
    
    vector3 = [vector1[x]*vector2[x]  for x in xrange(len(vector1))]
    vector4 = [1 for num in vector3 if num > 0.]
    co_occur_num = sum(vector4)

    if abs(co_occur_num) <= 1e-12:
        return 0.
    
    denominator = math.log(float(len(word_list1))) + math.log(float(len(word_list2))) # 分母
    
    if abs(denominator) < 1e-12:
        return 0.
    
    return co_occur_num / denominator
4. networkx 是怎么實(shí)現(xiàn) PageRank的

不得不說(shuō),寫 Python 的好處就是有各種第三方庫(kù)可以用。整個(gè)PageRank的計(jì)算過(guò)程,大佬都借助了 networkx 這個(gè)第三方庫(kù)。

networkx 中 PageRank 的路徑為 networkx/algorithms/link_analysis/pagerank_alg.py。我這邊就不貼出源碼了,共476行,把我驚出一身冷汗。定睛一看,原來(lái)注釋占了一半的行數(shù)。再仔細(xì)閱讀一遍,原來(lái)寫這個(gè)庫(kù)的大佬用3種不同的方法實(shí)現(xiàn)了3個(gè) PageRank 函數(shù),請(qǐng)收下我的膝蓋。

Python 的變量類型不明確,比如代碼中 W 這個(gè)變量,我知道是一張圖,但我不知道是用鄰接矩陣還是鄰接表或者是自定義類來(lái)表示的,需要向上回溯幾層代碼才能知道。所以閱讀這種大工程的 Python 代碼是需要花一點(diǎn)時(shí)間的。

如果有耐心理解源碼的話,可以發(fā)現(xiàn),networkx 中 PageRank 和論文中的數(shù)學(xué)公式還是有些不一樣的,主要的不一樣的點(diǎn)在于對(duì) dangling_nodes 的處理。

5. 總結(jié)

寫 Python 的好處就是有各種第三方庫(kù)可以用。

Python 的變量類型不明確,閱讀大工程的 Python 代碼是需要花一點(diǎn)時(shí)間的。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/45181.html

相關(guān)文章

  • 聊聊一行讀研時(shí)最成功的投資

    摘要:大家好,我是一行今天給大家聊聊一行在讀研里最成功的投資,那必然是鍵盤邊上的每一本技術(shù)書啦畢竟股票基金這種投資即使賺了錢,過(guò)段時(shí)間就得還回去,非常的神奇但是讀過(guò)的每一本技術(shù)書籍,都內(nèi)化在手指上了,只要給個(gè)鍵盤,就能給它實(shí) ...

    CarterLi 評(píng)論0 收藏0
  • CVTE2019春招前端二面涼經(jīng)

    摘要:在函數(shù)中通過(guò)賦予變量,在函數(shù)中,指向定時(shí)器以及回調(diào)函數(shù)當(dāng)不需要或者時(shí),定時(shí)器沒(méi)有被,定時(shí)器的回調(diào)函數(shù)以及內(nèi)部依賴的變量都不能被回收,造成內(nèi)存泄漏。比如使用了定時(shí)器,需要在中做對(duì)應(yīng)銷毀處理。 前言: 3月5日,從中山去往廣州,一大早7點(diǎn)多就做好準(zhǔn)備了,在高鐵站了30分鐘,轉(zhuǎn)廣州地鐵又站了90分鐘,去到地鐵口,就有一輛cvte的大巴車過(guò)來(lái)接送,我選擇的面試時(shí)間是11:00-12:00,但前...

    ningwang 評(píng)論0 收藏0
  • CVTE2019春招前端二面涼經(jīng)

    摘要:在函數(shù)中通過(guò)賦予變量,在函數(shù)中,指向定時(shí)器以及回調(diào)函數(shù)當(dāng)不需要或者時(shí),定時(shí)器沒(méi)有被,定時(shí)器的回調(diào)函數(shù)以及內(nèi)部依賴的變量都不能被回收,造成內(nèi)存泄漏。比如使用了定時(shí)器,需要在中做對(duì)應(yīng)銷毀處理。 前言: 3月5日,從中山去往廣州,一大早7點(diǎn)多就做好準(zhǔn)備了,在高鐵站了30分鐘,轉(zhuǎn)廣州地鐵又站了90分鐘,去到地鐵口,就有一輛cvte的大巴車過(guò)來(lái)接送,我選擇的面試時(shí)間是11:00-12:00,但前...

    zhangwang 評(píng)論0 收藏0
  • 2019春招前端實(shí)習(xí)面經(jīng)總結(jié)

    摘要:春招前端實(shí)習(xí)面試記錄從就開(kāi)始漸漸的進(jìn)行復(fù)習(xí),月末開(kāi)始面試,到現(xiàn)在四月中旬基本宣告結(jié)束。上海愛(ài)樂(lè)奇一面盒模型除之外的面向?qū)ο笳Z(yǔ)言繼承因?yàn)槭且曨l面試,只記得這么多,只感覺(jué)考察的面很廣,前端后端移動(dòng)端都問(wèn)了,某方面也有深度。 春招前端實(shí)習(xí)面試記錄(2019.3 ~ 2019.5) 從2019.1就開(kāi)始漸漸的進(jìn)行復(fù)習(xí),2月末開(kāi)始面試,到現(xiàn)在四月中旬基本宣告結(jié)束。在3月和4月經(jīng)歷了無(wú)數(shù)次失敗,沮...

    atinosun 評(píng)論0 收藏0
  • 手撕面試官系列(五):Tomcat+Mysql+設(shè)計(jì)模式面試專題

    摘要:面試題答案領(lǐng)取方式見(jiàn)主頁(yè)的缺省端口是多少,怎么修改有哪幾種運(yùn)行模式優(yōu)化有幾種部署方式容器是如何創(chuàng)建類實(shí)例用到了什么原理如何優(yōu)化內(nèi)存怎樣調(diào)優(yōu)垃圾回收怎樣策略調(diào)優(yōu)怎樣共享處理怎樣添加遠(yuǎn)程監(jiān)控專業(yè)點(diǎn)的分析工具有哪些關(guān)于的數(shù)目怎樣監(jiān)視的內(nèi)存使用情況 TomcatshowImg(https://segmentfault.com/img/remote/1460000019788819);(面試題+...

    GraphQuery 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<