<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 8506字,需瀏覽 18分鐘

           ·

          2022-04-18 07:38

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

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

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

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

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

          文本準備

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

          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)在開始使用今天的四個主角來提取關(guān)鍵字!

          Yake

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

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

          大寫term

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

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

          詞的位置

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

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

          詞頻

          (Term Frequency)
          一個詞在文本中出現(xiàn)的頻率越大,相對來說越重要,同時為了避免長文本詞頻越高的問題,會進行歸一化操作。

          其中,MeanTF是整個詞的詞頻均值, 是標準差。

          上下文關(guān)系

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

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

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

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

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

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

          安裝和使用

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

          首先從 Yake 實例中調(diào)用 KeywordExtractor 構(gòu)造函數(shù),它接受多個參數(shù),其中重要的是:要檢索的單詞數(shù)top,此處設(shè)置為 10。參數(shù) lan:此處使用默認值en??梢詡鬟f停用詞列表給參數(shù) stopwords。然后將文本傳遞給 extract_keywords 函數(shù),該函數(shù)將返回一個元組列表 (keyword: score)。關(guān)鍵字的長度范圍為 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é)果看有三個關(guān)鍵詞與作者提供的詞相同,分別是text mining, data miningtext vectorization methods。注意到Yake會區(qū)分大寫字母,并對以大寫字母開頭的單詞賦予更大的權(quán)重。

          Rake

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

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

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

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

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

          安裝和使用

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

          #?加載文本并對其應(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通過使用停用詞和短語分隔符解析文檔,將包含主要內(nèi)容的單詞分類為候選關(guān)鍵字。這基本上是通過以下一些步驟來完成的,首先,文檔文本被特定的單詞分隔符分割成一個單詞數(shù)組,其次,該數(shù)組再次被分割成一個在短語分隔符和停用單詞位置的連續(xù)單詞序列。最后,位于相同序列中的單詞被分配到文本中的相同位置,并一起被視為候選關(guān)鍵字。

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

          關(guān)鍵詞得分

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

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

          提取關(guān)鍵詞

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

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

          另一個庫

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

          TextRank

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

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

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

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

          安裝及使用

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

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

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

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

          KeyBERT

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

          安裝和使用

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

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

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

          kw_model?=?KeyBERT(model='all-mpnet-base-v2')
          它將像這樣開始下載:
          下載 BERT 預訓練模型
          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)鍵短語的長度在 1 到 2 之間,可以將 keyphrase_ngram_range 更改為 (1,2)。這次我們將 highlight 設(shè)置為 true。

          寫在最后

          到這里我們已經(jīng)一起學習了在提取關(guān)鍵字/關(guān)鍵短語領(lǐng)域使用的四種最棒的技術(shù),并提供了簡單代碼實現(xiàn)。這四種方法各有千秋。并且每個都成功地提取了與作者指定的關(guān)鍵字相同或接近并與該領(lǐng)域相關(guān)的關(guā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
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲三级影视 | 精品色欲| 免费看国产黄色 | 欧美www网站免费 | 国产精品宾馆在线 |