1. 【Python】用 Python 從單個(gè)文本中提取關(guān)鍵字的四種超棒的方法

        共 8506字,需瀏覽 18分鐘

         ·

        2022-04-18 07:38

        自然語(yǔ)言處理分析的最基本和初始步驟是關(guān)鍵詞提取,在NLP中,我們有許多算法可以幫助我們提取文本數(shù)據(jù)的關(guān)鍵字。本文中,云朵君將和大家一起學(xué)習(xí)四種即簡(jiǎn)單又有效的方法,它們分別是?Rake、Yake、Keybert 和 Textrank。并將簡(jiǎn)單概述下每個(gè)方法的使用場(chǎng)景,然后使用附加示例將其應(yīng)用于提取關(guān)鍵字。

        本文關(guān)鍵字:關(guān)鍵字提取、關(guān)鍵短語(yǔ)提取、Python、NLP、TextRank、Rake、BERT

        在我之前的文章中,我介紹了使用 Python 和 TFIDF 從文本中提取關(guān)鍵詞,TFIDF 方法依賴于語(yǔ)料庫(kù)統(tǒng)計(jì)來(lái)對(duì)提取的關(guān)鍵字進(jìn)行加權(quán),因此它的缺點(diǎn)之一是不能應(yīng)用于單個(gè)文本。

        為了說(shuō)明每種關(guān)鍵字提取方法(Rake、Yake、Keybert 和 Textrank)的實(shí)現(xiàn)原理,將使用已發(fā)表的文章[1]的摘要以及主題指定的關(guān)鍵字,并通過(guò)檢查哪些方法的提取的關(guān)鍵詞與作者設(shè)置的關(guān)鍵詞更接近,來(lái)檢驗(yàn)每種方法。在關(guān)鍵詞提取任務(wù)中,有顯式關(guān)鍵詞,即顯式地出現(xiàn)在文本中;也有隱式關(guān)鍵詞,即作者提到的關(guān)鍵詞沒(méi)有顯式地出現(xiàn)在文本中,而是與文章的領(lǐng)域相關(guān)。

        在上圖展示的示例中,有文本標(biāo)題和文章摘要,標(biāo)準(zhǔn)關(guān)鍵字(由作者在原始文章中定義)被標(biāo)記為黃色。注意machine learning這個(gè)詞并不明確,也沒(méi)有在摘要中找到。雖然可以在文章的全文中提取,但這里為了簡(jiǎn)單起見(jiàn),語(yǔ)料數(shù)據(jù)僅限于摘要。

        文本準(zhǔn)備

        標(biāo)題通常與提供的文本相結(jié)合,因?yàn)闃?biāo)題包含有價(jià)值的信息,并且高度概括了文章的內(nèi)容。因此,我們將文本和標(biāo)題兩個(gè)變量之間通過(guò)加上一個(gè)加號(hào)而簡(jiǎn)單地拼接。

        title?=?"VECTORIZATION?OF?TEXT?USING?DATA?MINING?METHODS"
        text?=?"In?the?text?mining?tasks,?textual?representation?should?be?not?only?efficient?but?also?interpretable,?as?this?enables?an?understanding?of?the?operational?logic?underlying?the?data?mining?models.?Traditional?text?vectorization?methods?such?as?TF-IDF?and?bag-of-words?are?effective?and?characterized?by?intuitive?interpretability,?but?suffer?from?the??curse?of?dimensionality?,?and?they?are?unable?to?capture?the?meanings?of?words.?On?the?other?hand,?modern?distributed?methods?effectively?capture?the?hidden?semantics,?but?they?are?computationally?intensive,?time-consuming,?and?uninterpretable.?This?article?proposes?a?new?text?vectorization?method?called?Bag?of?weighted?Concepts?BoWC?that?presents?a?document?according?to?the?concepts’?information?it?contains.?The?proposed?method?creates?concepts?by?clustering?word?vectors?(i.e.?word?embedding)?then?uses?the?frequencies?of?these?concept?clusters?to?represent?document?vectors.?To?enrich?the?resulted?document?representation,?a?new?modified?weighting?function?is?proposed?for?weighting?concepts?based?on?statistics?extracted?from?word?embedding?information.?The?generated?vectors?are?characterized?by?interpretability,?low?dimensionality,?high?accuracy,?and?low?computational?costs?when?used?in?data?mining?tasks.?The?proposed?method?has?been?tested?on?five?different?benchmark?datasets?in?two?data?mining?tasks;?document?clustering?and?classification,?and?compared?with?several?baselines,?including?Bag-of-words,?TF-IDF,?Averaged?GloVe,?Bag-of-Concepts,?and?VLAC.?The?results?indicate?that?BoWC?outperforms?most?baselines?and?gives?7%?better?accuracy?on?average"
        full_text?=?title?+",?"+?text?
        print("The?whole?text?to?be?usedn",?full_text)

        現(xiàn)在開(kāi)始使用今天的四個(gè)主角來(lái)提取關(guān)鍵字!

        Yake

        它是一種輕量級(jí)、無(wú)監(jiān)督的自動(dòng)關(guān)鍵詞提取方法,它依賴于從單個(gè)文檔中提取的統(tǒng)計(jì)文本特征來(lái)識(shí)別文本中最相關(guān)的關(guān)鍵詞。該方法不需要針對(duì)特定的文檔集進(jìn)行訓(xùn)練,也不依賴于字典、文本大小、領(lǐng)域或語(yǔ)言。Yake 定義了一組五個(gè)特征來(lái)捕捉關(guān)鍵詞特征,這些特征被啟發(fā)式地組合起來(lái),為每個(gè)關(guān)鍵詞分配一個(gè)分?jǐn)?shù)。分?jǐn)?shù)越低,關(guān)鍵字越重要。你可以閱讀原始論文[2],以及yake 的Python 包[3]關(guān)于它的信息。

        特征提取主要考慮五個(gè)因素(去除停用詞后)

        大寫(xiě)term

        (Casing)
        大寫(xiě)字母的term(除了每句話的開(kāi)頭單詞)的重要程度比那些小寫(xiě)字母的term重要程度要大。

        其中, ?表示該詞的大寫(xiě)次數(shù), 表示該詞的縮寫(xiě)次數(shù)。

        詞的位置

        (Word Position)
        文本越開(kāi)頭的部分句子的重要程度比后面的句子重要程度要大。

        其中 表示包含該詞的所有句子在文檔中的位置中位數(shù)。

        詞頻

        (Term Frequency)
        一個(gè)詞在文本中出現(xiàn)的頻率越大,相對(duì)來(lái)說(shuō)越重要,同時(shí)為了避免長(zhǎng)文本詞頻越高的問(wèn)題,會(huì)進(jìn)行歸一化操作。

        其中,MeanTF是整個(gè)詞的詞頻均值, 是標(biāo)準(zhǔn)差。

        上下文關(guān)系

        (Term Related to Context)
        一個(gè)詞與越多不相同的詞共現(xiàn),該詞的重要程度越低。

        其中 表示窗口size為 從左邊滑動(dòng), 表示從右邊滑動(dòng)。 表示出現(xiàn)在固定窗口大小為 下,出現(xiàn)不同的詞的個(gè)數(shù)。 表示所有詞頻的最大值。

        詞在句子中出現(xiàn)的頻率

        (Term Different Sentence)
        一個(gè)詞在越多句子中出現(xiàn),相對(duì)更重要

        其中 SF(t) 是包含詞t tt的句子頻率, 表示所有句子數(shù)量。
        最后計(jì)算每個(gè)term的分值公式如下:

        表示的是單詞 的分值情況,其中 分值越小,表示的單詞 越重要。

        安裝和使用

        pip?install?git+https://github.com/LIAAD/yake?
        import?yake

        首先從 Yake 實(shí)例中調(diào)用 KeywordExtractor 構(gòu)造函數(shù),它接受多個(gè)參數(shù),其中重要的是:要檢索的單詞數(shù)top,此處設(shè)置為 10。參數(shù) lan:此處使用默認(rèn)值en??梢詡鬟f停用詞列表給參數(shù) stopwords。然后將文本傳遞給 extract_keywords 函數(shù),該函數(shù)將返回一個(gè)元組列表 (keyword: score)。關(guān)鍵字的長(zhǎng)度范圍為 1 到 3。

        kw_extractor?=?yake.KeywordExtractor(top=10,?stopwords=None)
        keywords?=?kw_extractor.extract_keywords(full_text)
        for?kw,?v?in?keywords:
        ???print("Keyphrase:?",kw,?":?score",?v)

        從結(jié)果看有三個(gè)關(guān)鍵詞與作者提供的詞相同,分別是text mining, data miningtext vectorization methods。注意到Yake會(huì)區(qū)分大寫(xiě)字母,并對(duì)以大寫(xiě)字母開(kāi)頭的單詞賦予更大的權(quán)重。

        Rake

        Rake 是 Rapid Automatic Keyword Extraction 的縮寫(xiě),它是一種從單個(gè)文檔中提取關(guān)鍵字的方法。實(shí)際上提取的是關(guān)鍵的短語(yǔ)(phrase),并且傾向于較長(zhǎng)的短語(yǔ),在英文中,關(guān)鍵詞通常包括多個(gè)單詞,但很少包含標(biāo)點(diǎn)符號(hào)和停用詞,例如and,the,of等,以及其他不包含語(yǔ)義信息的單詞。

        Rake算法首先使用標(biāo)點(diǎn)符號(hào)(如半角的句號(hào)、問(wèn)號(hào)、感嘆號(hào)、逗號(hào)等)將一篇文檔分成若干分句,然后對(duì)于每一個(gè)分句,使用停用詞作為分隔符將分句分為若干短語(yǔ),這些短語(yǔ)作為最終提取出的關(guān)鍵詞的候選詞。

        每個(gè)短語(yǔ)可以再通過(guò)空格分為若干個(gè)單詞,可以通過(guò)給每個(gè)單詞賦予一個(gè)得分,通過(guò)累加得到每個(gè)短語(yǔ)的得分。Rake 通過(guò)分析單詞的出現(xiàn)及其與文本中其他單詞的兼容性(共現(xiàn))來(lái)識(shí)別文本中的關(guān)鍵短語(yǔ)。最終定義的公式是:

        即單詞 的得分是該單詞的度(是一個(gè)網(wǎng)絡(luò)中的概念,每與一個(gè)單詞共現(xiàn)在一個(gè)短語(yǔ)中,度就加1,考慮該單詞本身)除以該單詞的詞頻(該單詞在該文檔中出現(xiàn)的總次數(shù))。

        然后對(duì)于每個(gè)候選的關(guān)鍵短語(yǔ),將其中每個(gè)單詞的得分累加,并進(jìn)行排序,RAKE將候選短語(yǔ)總數(shù)的前三分之一的認(rèn)為是抽取出的關(guān)鍵詞。

        安裝和使用

        #?$?git?clone?https://github.com/zelandiya/RAKE-tutorial
        #?要在python代碼中導(dǎo)入rake:
        import?rake?
        import?operator

        #?加載文本并對(duì)其應(yīng)用rake:
        filepath?=?"keyword_extraction.txt"
        rake_object?=?rake.Rake(filepath)
        text?=?"Compatibility?of?systems?of?linear?constraints?over?the?set?of?natural?numbers.?Criteria?of?compatibility?of?a?system?of?linear?Diophantine?equations,?strict?inequations,?and?nonstrict?inequations?are?considered.Upper?bounds?for?components?of?a?minimal?set?of?solutions?and?algorithms?of?construction?of?minimal?generatingsets?of?solutions?for?all?types?of?systems?are?given.?These?criteria?and?the?corresponding?algorithms?for?constructing?a?minimal?supporting?set?of?solutions?can?be?used?in?solving?all?the?considered?types?of?systems?and?systems?of?mixed?types."
        sample_file?=?open(“data/docs/fao_test/w2167e.txt”,?‘r’)
        text?=?sample_file.read()
        keywords?=?rake_object.run(text)?print?“Keywords:”,?keywords

        候選關(guān)鍵字

        如上所述,我們知道RAKE通過(guò)使用停用詞和短語(yǔ)分隔符解析文檔,將包含主要內(nèi)容的單詞分類為候選關(guān)鍵字。這基本上是通過(guò)以下一些步驟來(lái)完成的,首先,文檔文本被特定的單詞分隔符分割成一個(gè)單詞數(shù)組,其次,該數(shù)組再次被分割成一個(gè)在短語(yǔ)分隔符和停用單詞位置的連續(xù)單詞序列。最后,位于相同序列中的單詞被分配到文本中的相同位置,并一起被視為候選關(guān)鍵字。

        stopwordpattern?=?rake.build_stop_word_regex(filepath)
        phraseList?=?rake.generate_candidate_keywords(sentenceList,?stopwordpattern)

        關(guān)鍵詞得分

        從文本數(shù)據(jù)中識(shí)別出所有候選關(guān)鍵字后,將生成單詞共現(xiàn)圖,該圖計(jì)算每個(gè)候選關(guān)鍵字的分?jǐn)?shù),并定義為成員單詞分?jǐn)?shù)。借助該圖,我們根據(jù)圖中頂點(diǎn)的程度和頻率評(píng)估了計(jì)算單詞分?jǐn)?shù)的幾個(gè)指標(biāo)。

        keywordcandidates?=?rake.generate_candidate_keyword_scores(phraseList,?wordscores)

        提取關(guān)鍵詞

        計(jì)算候選關(guān)鍵字得分后,將從文檔中選擇前T個(gè)候選關(guān)鍵字。T值是圖中字?jǐn)?shù)的三分之一。

        totalKeywords?=?len(sortedKeywords)
        for?keyword?in?sortedKeywords[0:(totalKeywords?/?3)]:?
        ??????print?“Keyword:?“,?keyword[0],?“,?score:?“,?keyword[1]

        另一個(gè)庫(kù)

        #?pip?install?multi_rake
        from?multi_rake?import?Rake
        rake?=?Rake()
        keywords?=?rake.apply(full_text)
        print(keywords[:10])

        TextRank

        TextRank 是一種用于提取關(guān)鍵字和句子的無(wú)監(jiān)督方法。它一個(gè)基于圖的排序算法。其中每個(gè)節(jié)點(diǎn)都是一個(gè)單詞,邊表示單詞之間的關(guān)系,這些關(guān)系是通過(guò)定義單詞在預(yù)定大小的移動(dòng)窗口內(nèi)的共現(xiàn)而形成的。

        該算法的靈感來(lái)自于 Google 用來(lái)對(duì)網(wǎng)站進(jìn)行排名的 PageRank。它首先使用詞性 (PoS) 對(duì)文本進(jìn)行標(biāo)記和注釋。它只考慮單個(gè)單詞。沒(méi)有使用 n-gram,多詞是后期重構(gòu)的。

        TextRank算法是利用局部詞匯之間關(guān)系(共現(xiàn)窗口)對(duì)后續(xù)關(guān)鍵詞進(jìn)行排序,直接從文本本身抽取。其主要步驟如下:

        1. 把給定的文本T按照完整句子進(jìn)行分割,即
        2. 對(duì)于每個(gè)句子,進(jìn)行分詞和詞性標(biāo)注處理,并過(guò)濾掉停用詞,只保留指定詞性的單詞,如名詞、動(dòng)詞、形容詞,即 ,其中是保留后的候選關(guān)鍵詞。
        3. 構(gòu)建候選關(guān)鍵詞圖 ,其中V為節(jié)點(diǎn)集,由(2)生成的候選關(guān)鍵詞組成,然后采用共現(xiàn)關(guān)系co-occurrence構(gòu)造任兩點(diǎn)之間的邊,兩個(gè)節(jié)點(diǎn)之間存在邊僅當(dāng)它們對(duì)應(yīng)的詞匯在長(zhǎng)度為K的窗口中共現(xiàn),K表示窗口大小,即最多共現(xiàn)K個(gè)單詞。
        4. 根據(jù)上面公式,迭代傳播各節(jié)點(diǎn)的權(quán)重,直至收斂。
        5. 對(duì)節(jié)點(diǎn)權(quán)重進(jìn)行倒序排序,從而得到最重要的T個(gè)單詞,作為候選關(guān)鍵詞。
        6. 由(5)得到最重要的T個(gè)單詞,在原始文本中進(jìn)行標(biāo)記,若形成相鄰詞組,則組合成多詞關(guān)鍵詞。例如,文本中有句子“Matlab code for plotting ambiguity function”,如果“Matlab”和“code”均屬于候選關(guān)鍵詞,則組合成“Matlab code”加入關(guān)鍵詞序列。

        安裝及使用

        要使用Textrank生成關(guān)鍵字,必須首先安裝 summa 包,然后必須導(dǎo)入模塊 keywords

        pip?install?summa?
        from?summa?import?keywords

        之后,只需調(diào)用 keywords 函數(shù)并將要處理的文本傳遞給它。我們還將 scores 設(shè)置為 True 以打印出每個(gè)結(jié)果關(guān)鍵字的相關(guān)性。

        TR_keywords?=?keywords.keywords(full_text,?scores=True)?
        print(TR_keywords[0:10])

        KeyBERT

        KeyBERT[4]是一種簡(jiǎn)單易用的關(guān)鍵字提取算法,它利用 SBERT 嵌入從文檔中生成與文檔更相似的關(guān)鍵字和關(guān)鍵短語(yǔ)。首先,使用 sentences-BERT 模型生成文檔embedding。然后為 N-gram 短語(yǔ)提取詞的embedding。然后使用余弦相似度測(cè)量每個(gè)關(guān)鍵短語(yǔ)與文檔的相似度。最后將最相似的詞識(shí)別為最能描述整個(gè)文檔并被視為關(guān)鍵字的詞。

        安裝和使用

        要使用 keybert 生成關(guān)鍵字,必須先安裝 keybert 包,然后才能導(dǎo)入模塊 keyBERT。

        pip?install?keybert
        from?keybert?import?KeyBERT

        然后創(chuàng)建一個(gè)接受一個(gè)參數(shù)的 keyBERT 實(shí)例,即 Sentences-Bert 模型??梢詮囊韵?span style="color: #1e6bb8;font-weight: bold;">來(lái)源[5]中選擇想要的任何embedding模型。根據(jù)作者的說(shuō)法,all-mpnet-base-v2模型是最好的。

        kw_model?=?KeyBERT(model='all-mpnet-base-v2')
        它將像這樣開(kāi)始下載:
        下載 BERT 預(yù)訓(xùn)練模型
        keywords?=?kw_model.extract_keywords(full_text,?
        ?????????????????????????????????????keyphrase_ngram_range=(1,?3),?
        ?????????????????????????????????????stop_words='english',?
        ?????????????????????????????????????highlight=False,?
        ?????????????????????????????????????top_n=10)?

        keywords_list=?list(dict(keywords).keys())?
        print(keywords_list)

        考慮到大多數(shù)關(guān)鍵短語(yǔ)的長(zhǎng)度在 1 到 2 之間,可以將 keyphrase_ngram_range 更改為 (1,2)。這次我們將 highlight 設(shè)置為 true。

        寫(xiě)在最后

        到這里我們已經(jīng)一起學(xué)習(xí)了在提取關(guān)鍵字/關(guān)鍵短語(yǔ)領(lǐng)域使用的四種最棒的技術(shù),并提供了簡(jiǎn)單代碼實(shí)現(xiàn)。這四種方法各有千秋。并且每個(gè)都成功地提取了與作者指定的關(guān)鍵字相同或接近并與該領(lǐng)域相關(guān)的關(guān)鍵字。

        若你有學(xué)到一點(diǎn)什么,記得?點(diǎn)贊 收藏 加關(guān)注 哦!

        參考資料

        [1]

        文章: https://www.researchgate.net/publication/353592446_TEXT_VECTORIZATION_USING_DATA_MINING_METHODS

        [2]

        論文: https://www.sciencedirect.com/science/article/abs/pii/S0020025519308588

        [3]

        yake包: https://github.com/LIAAD/yake

        [4]

        KeyBERT: https://github.com/MaartenGr/KeyBERT

        [5]

        pretrained_models: https://www.sbert.net/docs/pretrained_models.html

        [6]

        https://links.jianshu.com/go?to=https%3A%2F%2Fmedium.datadriveninvestor.com%2Frake-rapid-automatic-keyword-extraction-algorithm-f4ec17b2886c

        [7]

        https://blog.csdn.net/chinwuforwork/article/details/77993277



        往期精彩回顧




        瀏覽 81
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
          
          

            1. 日本不卡高清视频 | 天天色综合av | 亚洲美女性爱 | 久久在线播放 | 雷电将军和丘丘人繁衍后代视频 |