者:悅然wordpress建站(悅然建站)
繼續分享wordpress建站教程,今天給大家分享一個實現文章顯示字數統計和預計閱讀時間的方法。可能大家也看到過有些網站有此功能有,這是怎么睡以實現的呢?
接下來悅然網絡工作室(悅然建站)就給大家分享兩個實現方法。
把下面的代碼添加到當前wordpress建站主題的functions.php文件中。
//文章字數和預計閱讀時間統計 悅然建站收集整理分享
function count_words_read_time () {
global $post;
$text_num=mb_strlen(preg_replace('/\s/','',html_entity_decode(strip_tags($post->post_content))),'UTF-8');
$read_time=ceil($text_num/400);
$output .='本文共有' . $text_num . '個字,閱讀需要' . $read_time . '分鐘。';
return $output;
}
上面的中文提示可以自行修改,也可以改成英文的。
Wordpress建站教程:使用插件替換Functions.Php
上面的代碼也可以添加到Code Snippets插件中,如果你的網站functions.php文件添加過多段代碼,那么使用這個插件會比較方便。
接下來我們還需要在當前主題的single.php文件中添加下面的代碼才能生效:
<?php echo count_words_read_time(); ?>
使用插件是最簡單的方法,悅然建站找到了兩個插件,分別是Reading Time、Reading Time WP,這里推薦使用Reading Time WP,可以在wordpress插件中心下載,也可以通過下面的地址下載安裝。
下載地址
https://downloads.wordpress.org/plugin/reading-time-wp.2.0.10.zip
啟用之后設置一下就可以了,如上圖,設置項很簡單,雖然是英文,但并不影響使用。
以上就是今天給大家分享的wordpress建站教程,給網站添加字數統計與估計閱讀時間,可以提升一些網站用戶體驗。這比較適合一些文章內容豐富的網站,如果你的網站內容基本都是1000字以內的,那就不建議添加了,沒什么意義。
自floydhub
作者:Alfrick Opidi
機器之心編譯
參與:杜偉、張倩
我們在閱讀新聞報道等實時性文章時,需要快速歸納出文章的大意。但是,如果將一篇很長的文章歸納成一個能夠涵蓋原文中心思想的小段落,則需要我們耗費大量時間。本文介紹了自然語言處理中的兩種文本自動摘要生成方法——抽取式和抽象式文本摘要。這兩種方法通過計算文本中句子成分的權重來生成摘要,可以大大節省通讀全文以及歸納總結主要信息的時間,為讀者提供方便。
你是否曾將一篇冗長的文檔歸納為一個小的段落?你用了多長時間呢?手動歸納總結耗費時間、枯燥乏味。文本自動摘要可以克服此類難題,幫你輕松歸納出一篇文章的中心思想。
文本摘要方法能夠對冗長文本進行簡潔準確的總結,同時將重點放在傳達有用信息的章節,而又不失去文章大意。
文本自動摘要旨在將冗長文檔變成縮寫版本,若手動完成則可能非常麻煩且成本高昂。
在生成需要的摘要文本之前,機器學習算法可被訓練用以理解文檔,識別傳達重要事實和信息的章節。
使用文本摘要機器學習算法生成一篇在線新聞文章的摘要。
文本自動摘要的必要性
隨著目前數字空間中數據的爆炸式增長,而大多又是非結構化的文本數據,因而需要開發文本自動摘要工具,使人們可以輕易獲知文本大意。當前,我們可以快速訪問大量信息。但是,大多數信息冗長、無關緊要,還可能無法傳達其本意。例如,如果你想從一篇在線新聞報道中搜尋一些特定信息,你也許要吃透報道內容,花費大量時間剔除無用信息,之后才能找到自己想要了解的信息。所以,使用能夠提取有用信息并剔除無關緊要和無用數據的自動文本摘要生成器變得非常重要。文本摘要的實現可以增強文檔的可讀性,減少搜尋信息的時間,獲得更多適用于特定領域的信息。
文本自動摘要的主要類型
從廣義的角度看,自然語言處理(NLP)中有兩種文本摘要生成方法:抽取式和抽象式。
抽取式摘要(extraction-based summarization)
在抽取式摘要中,抽取一段文本中表示重點內容的單詞子集,并結合起來生成摘要。我們可以將抽取式摘要看作是一支熒光筆-從源文本中抽取主要信息。
熒光筆=抽取式摘要
在機器學習中,抽取式摘要通常需要衡量基本句子成分的權重,并根據權重結果生成摘要。
不同類型的算法和方法均可用于衡量句子的權重,之后根據各成分之間的關聯性和相似性進行排序-并進一步將這些成分連接起來以生成摘要。
如下例所示:
抽取式摘要
如上例所示,抽取式摘要由熒光筆標黃的單詞組成,生成摘要的語法可能不準確。
抽象式摘要
在抽象式摘要中,高級深度學習方法(advanced deep learning technique)用于解釋和縮寫原始文檔,就像人類所做的一樣。將抽象式摘要想象成一支鋼筆-它能生成或許不屬于源文檔的新句子。
鋼筆=抽象式摘要
由于抽象式機器學習算法能夠生成表示源文本中最重要信息的新短語和句子,所以這些抽象式算法有助于克服抽取式摘要中的語法不準確問題。
如下例所示:
抽象式摘要。
盡管抽象式文本摘要的表現更好,但開發相關算法需要復雜的深度學習技巧和語言模型。
為了獲得合理產出,抽象式摘要方法必須能夠解決諸多自然語言處理問題,如自然語言生成、語義表征和推理排序(inference permutation)。
同樣地,抽取式文本摘要方法依然大受歡迎。在本文中,我們將重點介紹抽象式文本摘要方法。
如何執行文本摘要
我們使用以下一段話展示如何執行文本摘要抽取:
我們依照以下步驟對這段話作總結,同時盡可能保留原意。
第一步:將這段話轉換成句子
首先,我們將這段話分割成相應的句子。轉換成句子的最佳方法是在句點(period)出現時提取一個句子。
第二步:文本處理
接下來,我們在文本處理中移除停止詞(那些沒有實際意義的常見詞,如「and」和「the」)、數字、標點符號以及句子中的其他特殊字符。
句子成分的過濾有助于移除冗余和不重要的信息,這些信息對文本意圖的表達或許沒有任何價值。
以下是文本處理結果:
第三步:分詞
切分各個句子,列出句子中的所有單詞。
以下是單詞列表:
['peter','elizabeth','took','taxi','attend','night','party','city','party','elizabeth','collapse','rush','hospital', 'diagnose','brain', 'injury', 'doctor','told','peter','stay','besides','get','well','peter', 'stayed','hospital','days','without','leaving']
第四步:評估單詞的加權出現頻率(occurrence frequency)
緊接著,我們計算所有單詞的加權出現頻率。為此,我們用每個單詞的出現頻率除以這段話中出現最多次的單詞的頻率,在這段話中出現最多的是 Peter,總共出現了三次。
下表給出了每個單詞的加權出現頻率。
第五步:用相應的加權頻率替代原句中的各個單詞,然后計算總和。
我們在文本處理步驟中已經移除了停止詞和特殊字符等無關緊要的單詞,因而它們的加權頻率為零,也就沒有必要在計算時加上。
根據所有單詞的加權頻率總和,我們可以推導出:第一個句子在整段話中的權重最大。所以,第一個句子能夠對這段話的意思作出最具代表性的總結。
此外,如果第一個句子與第三個句子(該句的權重在整段話中排第二)相結合,則可以作出更好的總結。
以上例子只是基本說明了如何在機器學習中執行抽取式文本摘要。現在,我們看看如何在創建實際摘要生成器中運用上述概念。
維基百科文章的文本摘要
讓我們動手創建一個可以簡化冗長 web 文章中信息的文本摘要生成器。為簡單起見,除了 Python 的 NLTK toolkit,我們不使用任何其他機器學習庫(machine learning library)。
以下是摘要生成器的代碼 blueprint:
# Creating a dictionary for the word frequency table frequency_table=_create_dictionary_table(article) # Tokenizing the sentences sentences=sent_tokenize(article) # Algorithm for scoring a sentence by its words sentence_scores=_calculate_sentence_scores(sentences, frequency_table) # Getting the threshold threshold=_calculate_average_score(sentence_scores) # Producing the summary article_summary=_get_article_summary(sentences, sentence_scores, 1.5 * threshold) print(article_summary)
依照下列步驟使用 Python 語言創建一個簡單的文本摘要生成器。
第一步:準備數據
在這個例子中,我們想總結一下這篇 Wikipedia 文章的信息,這篇文章只是對 20 世紀發生的主要事件進行概述。
為了獲取這篇文章的文本,我們將使用 Beautiful Soup 庫。
以下是抓取文章內容的代碼:
import bs4 as BeautifulSoup import urllib.request # Fetching the content from the URL fetched_data=urllib.request.urlopen('https://en.wikipedia.org/wiki/20th_century') article_read=fetched_data.read() # Parsing the URL content and storing in a variable article_parsed=BeautifulSoup.BeautifulSoup(article_read,'html.parser') # Returning <p> tags paragraphs=article_parsed.find_all('p') article_content='' # Looping through the paragraphs and adding them to the variable for p in paragraphs: article_content +=p.text
在以上代碼中,我們首先導入抓取網頁數據所必需的庫。BeautifulSoup 庫用于解析網頁內容,而 urllib library 用于連接網頁和檢索 HTML。
BeautifulSoup 將輸入文本轉化為 Unicode 字符,將輸出文本轉化為 UTF-8 字符,省去了從 web 上抓取文本時處理不同字符集編碼的麻煩。
我們使用 urllib.request 程序中的 urlopen 函數打開網頁。之后,使用 read 函數讀取所抓取的數據對象。為了解析數據,我們調用 BeautifulSoup 對象,并向它傳遞兩個參數,即 article_read 和 html.parser。
find_all 函數用于傳回 HTML 中出現的所有<p>元素。此外,.text 使我們只能選擇<p>元素中的文本。
第二步:處理數據
為盡可能確保廢棄的文本數據無噪聲,我們將執行一些基本的文本清理(text cleaning)。為協助完成這一處理過程,我們將從 NLTK 庫中導入一個停止詞列表。
我們還將引入 PorterStemmer,這是一種將單詞還原成詞根形式的算法。例如,單詞 cleaning、cleaned 和 cleaner 都可以還原成詞根 clean。
此外,我們還將創建一個包含文本中每一單詞出現頻率的字典表。我們將依次讀取文本及相應單詞,以消除所有停止詞。
之后,我們將檢查單詞是否出現在 frequency_table 中。如果一個單詞之前就在字典中,則其值更新 1。否則,如果一個單詞首次被識別到,則其值設置為 1。
例如,頻率表應如下所示:
代碼如下:
from nltk.corpus import stopwords from nltk.stem import PorterStemmer def _create_dictionary_table(text_string) -> dict: # Removing stop words stop_words=set(stopwords.words("english")) words=word_tokenize(text_string) # Reducing words to their root form stem=PorterStemmer() # Creating dictionary for the word frequency table frequency_table=dict() for wd in words: wd=stem.stem(wd) if wd in stop_words: continue if wd in frequency_table: frequency_table[wd] +=1 else: frequency_table[wd]=1 return frequency_table
第三步:將文章分割成句子
為了將 article_content 分割成一個句子集,我們將使用 NLTK 庫中的內置方法。
from nltk.tokenize import word_tokenize, sent_tokenize sentences=sent_tokenize(article)
第四步:確定句子的加權頻率
為了評估文本中每個句子的分數,我們將分析每個單詞的出現頻率。在這種情況下,我們將根據句子中的單詞對該句進行評分,也就是加上句子中每個重要單詞的出現頻率。
請看以下代碼:
def _calculate_sentence_scores(sentences, frequency_table) -> dict: # Algorithm for scoring a sentence by its words sentence_weight=dict() for sentence in sentences: sentence_wordcount=(len(word_tokenize(sentence))) sentence_wordcount_without_stop_words=0 for word_weight in frequency_table: if word_weight in sentence.lower(): sentence_wordcount_without_stop_words +=1 if sentence[:7] in sentence_weight: sentence_weight[sentence[:7]] +=frequency_table[word_weight] else: sentence_weight[sentence[:7]]=frequency_table[word_weight] sentence_weight[sentence[:7]]=sentence_weight[sentence[:7]] / sentence_wordcount_without_stop_words return sentence_weight
重要的是,為了避免長句的分數必然高于短句,我們用每個句子的分數除以該句中的單詞數。
另外,為了優化字典內存,我們任意添加 sentence[:7],這指的是每個句子的前七個字符。但在較長的文檔中,你很可能遇到具有相同首個 n_chars 的句子,這時最好使用哈希函數(hash function)或 index 函數(index function)來處理此類極端情況(edge-cases),避免沖突。
第五步:計算句子閾值
為了進一步調整適合摘要的句子類型,我們將創建句子的平均分。借助于這個閾值,我們可以避免選擇分數低于平均分的句子。
代碼如下:
def _calculate_average_score(sentence_weight) -> int: # Calculating the average score for the sentences sum_values=0 for entry in sentence_weight: sum_values +=sentence_weight[entry] # Getting sentence average value from source text average_score=(sum_values / len(sentence_weight)) return average_score
第六步:生成摘要
最后,我們擁有了所有必需的參數,因而現在可以生成文章摘要了。
代碼如下:
def _get_article_summary(sentences, sentence_weight, threshold): sentence_counter=0 article_summary='' for sentence in sentences: if sentence[:7] in sentence_weight and sentence_weight[sentence[:7]] >=(threshold): article_summary +=" " + sentence sentence_counter +=1 return article_summary
總結
下圖展示了創建文本摘要算法的工作流程。
以下是機器學習中簡單抽取式文本摘要生成器的完整代碼:
#importing libraries from nltk.corpus import stopwords from nltk.stem import PorterStemmer from nltk.tokenize import word_tokenize, sent_tokenize import bs4 as BeautifulSoup import urllib.request #fetching the content from the URL fetched_data=urllib.request.urlopen('https://en.wikipedia.org/wiki/20th_century') article_read=fetched_data.read() #parsing the URL content and storing in a variable article_parsed=BeautifulSoup.BeautifulSoup(article_read,'html.parser') #returning <p> tags paragraphs=article_parsed.find_all('p') article_content='' #looping through the paragraphs and adding them to the variable for p in paragraphs: article_content +=p.text def _create_dictionary_table(text_string) -> dict: #removing stop words stop_words=set(stopwords.words("english")) words=word_tokenize(text_string) #reducing words to their root form stem=PorterStemmer() #creating dictionary for the word frequency table frequency_table=dict() for wd in words: wd=stem.stem(wd) if wd in stop_words: continue if wd in frequency_table: frequency_table[wd] +=1 else: frequency_table[wd]=1 return frequency_table def _calculate_sentence_scores(sentences, frequency_table) -> dict: #algorithm for scoring a sentence by its words sentence_weight=dict() for sentence in sentences: sentence_wordcount=(len(word_tokenize(sentence))) sentence_wordcount_without_stop_words=0 for word_weight in frequency_table: if word_weight in sentence.lower(): sentence_wordcount_without_stop_words +=1 if sentence[:7] in sentence_weight: sentence_weight[sentence[:7]] +=frequency_table[word_weight] else: sentence_weight[sentence[:7]]=frequency_table[word_weight] sentence_weight[sentence[:7]]=sentence_weight[sentence[:7]] / sentence_wordcount_without_stop_words return sentence_weight def _calculate_average_score(sentence_weight) -> int: #calculating the average score for the sentences sum_values=0 for entry in sentence_weight: sum_values +=sentence_weight[entry] #getting sentence average value from source text average_score=(sum_values / len(sentence_weight)) return average_score def _get_article_summary(sentences, sentence_weight, threshold): sentence_counter=0 article_summary='' for sentence in sentences: if sentence[:7] in sentence_weight and sentence_weight[sentence[:7]] >=(threshold): article_summary +=" " + sentence sentence_counter +=1 return article_summary def _run_article_summary(article): #creating a dictionary for the word frequency table frequency_table=_create_dictionary_table(article) #tokenizing the sentences sentences=sent_tokenize(article) #algorithm for scoring a sentence by its words sentence_scores=_calculate_sentence_scores(sentences, frequency_table) #getting the threshold threshold=_calculate_average_score(sentence_scores) #producing the summary article_summary=_get_article_summary(sentences, sentence_scores, 1.5 * threshold) return article_summary if __name__=='__main__': summary_results=_run_article_summary(article_content) print(summary_results)
點擊原文中的以下按鈕在 FloydHub Notebook 上運行代碼:
在這個例子中,我們所采用的閾值是平均分的 1.5 倍。這個超參數值(hyperparameter value)在幾次試驗后為我們生成了良好的結果。當然,你可以根據自身的偏好對數值進行微調,并改進摘要生成效果。
下圖是 Wikipedia 文章的生成摘要。
使用文本摘要算法生成的 Wikipedia 文章摘要。
如你所見,運行代碼可以對冗長的 Wikipedia 文章進行總結,并簡要概述 20 世紀發生的主要事件。
盡管如此,我們還可以改進摘要生成器,使之更好地生成長篇幅文本的簡潔、精確摘要。
更多內容
當然,本文只是簡要介紹了機器學習中使用文本摘要算法所能實現的功能。
若想了解更多有關該主題,特別是抽象式文本摘要的知識,下面一些有用的資源可以為你提供幫助:
有沒有可能將兩種方法(抽象式和抽取式文本自動摘要)相結合?這是指針生成網絡(pointer generator network)的主要原理,該網絡通過結合抽取(指向)和抽象(生成)取得了最佳效果。
圖源:"Taming Recurrent Neural Networks for Better Summarization"
《WikiHow: A Large Scale Text Summarization Dataset》一文提出了一個新的大規模文本自動摘要數據集 WikiHow,該數據集包含提取自 WikiHow 在線知識庫的 230000 多篇文章。目前可用的大多數數據集的規模不足以訓練序列到序列模型,它們也許只能提供有限的摘要,并且更適合執行抽取式摘要。但是,WikiHow 數據集規模大,質量高,能夠在抽象式文本摘要中獲得最優結果。
《Pretraining-Based Natural Language Generation for Text Summarization》一文提出了一個基于序列到序列范式的獨特二階段模型。該模型同時在編碼器和解碼器側利用 BERT,并在學習過程中注重強化目標。當該模型在一些基準數據集上進行評估時,結果顯示,該方法在文本自動摘要中表現更好,尤其相較于其他傳統系統而言。
原文鏈接:https://blog.floydhub.com/gentle-introduction-to-text-summarization-in-machine-learning/
本文為機器之心編譯,轉載請聯系本公眾號獲得授權。
?------------------------------------------------
加入機器之心(全職記者 / 實習生):hr@jiqizhixin.com
投稿或尋求報道:content@jiqizhixin.com
廣告 & 商務合作:bd@jiqizhixin.com
態網站建站現在有很多快速的技術和平臺,但靜態是優點也有缺點,由于是靜態的,一些動態的內容如評論、計數等等模塊就需要借助外來平臺,評論有“多說”,計數有“不蒜”!(多說已經關閉,不蒜子還活著)
“不蒜子”與百度統計谷歌分析等有區別:“不蒜子”可直接將訪問次數顯示在您在網頁上(也可不顯示);對于已經上線一段時間的網站,“不蒜子”允許您初始化首次數據。。
普通用戶只需兩步走:一行腳本+一行標簽,搞定一切。追求極致的用戶可以進行任意DIY。
要使用不蒜子必須在頁面中引入busuanzi.js,目前最新版如下。
<script async src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>
不蒜子可以給任何類型的個人站點使用,如果你是用的hexo,打開themes/你的主題/layout/_partial/footer.ejs添加上述腳本即可,當然你也可以添加到 header 中。
只需要復制相應的html標簽到你的網站要顯示訪問量的位置即可。您可以隨意更改不蒜子標簽為自己喜歡的顯示效果,內容參考第三部分擴展開發。根據你要顯示內容的不同,這分幾種情況。
要顯示站點總訪問量,復制以下代碼添加到你需要顯示的位置。有兩種算法可選:
算法a:pv的方式,單個用戶連續點擊n篇文章,記錄n次訪問量。
本站總訪問量<span id="busuanzi_value_site_pv"></span>次
算法b:uv的方式,單個用戶連續點擊n篇文章,只記錄1次訪客數。
本站訪客數<span id="busuanzi_value_site_uv"></span>人次
如果你是用的hexo,打開themes/你的主題/layout/_partial/footer.ejs添加即可。
實例效果參考:
https://blog.ccswust.org/busuanzi/
要顯示每篇文章的訪問量,復制以下代碼添加到你需要顯示的位置。
算法:pv的方式,單個用戶點擊1篇文章,本篇文章記錄1次閱讀量。
本站總訪問量<span id="busuanzi_value_site_pv"></span>次
代碼中文字是可以修改的,只要保留id正確即可。
注意:不蒜子為保持極簡,暫不支持在站點文章摘要列表中(如首頁)逐個顯示每篇文章的閱讀次數,如果您非常需要這一功能,可以留言。根據需要程度再考慮開發相應的功能。
實例效果參考:
https://blog.ccswust.org/busuanzi/pv.html
注意:不蒜子為保持極簡,暫不支持在站點文章摘要列表中(如首頁)逐個顯示每篇文章的閱讀次數,如果您非常需要這一功能,可以留言。根據需要程度再考慮開發相應的功能。
本站訪客數<span id="busuanzi_value_site_uv"></span>人次
實例效果參考:
https://blog.ccswust.org/busuanzi/ip.html
只安裝腳本代碼,不安裝標簽代碼。
至此,不蒜子已經可以正常運行,如果你還要自定義一些內容或有疑問,請繼續閱讀。
不蒜子之所以稱為極客的算子,正是因為不蒜子自身只提供標簽+數字,至于顯示的style和css動畫效果,任你發揮。
因此,你也可以使用極簡模式:
本站總訪問量<span id="busuanzi_value_site_pv"></span>次本站訪客數<span id="busuanzi_value_site_uv"></span>人次本文總閱讀量<span id="busuanzi_value_page_pv"></span>次
或者個性化一下:
Total <span id="busuanzi_value_site_pv"></span> views.您是xxx的第<span id="busuanzi_value_site_uv"></span>個小伙伴<span id="busuanzi_value_page_pv"></span> Hits
1、我只要統計不顯示?只引入busuanzi.js,不引入顯示標簽即可。
2、你的標簽太丑了,我想美化一下可以么?可以的,您可以用自己站點的css進行控制,只要內層span的id正確以便回填訪問次數即可,甚至標簽都可以不是span。
3、中文字體太丑了,我的主題不適合?您可以將本站總訪問量xxx次改成view xxx times等英文以獲得更和諧的顯示效果。
4、在訪問量數據未取回來之前,我不想讓頁面顯示為諸如“本站總訪問量 次”,顯得太low,怎么辦?只需要如下css,不蒜子執行完畢會自動將標簽顯示出來,其他以此類推:
<span id="busuanzi_container_site_pv" style='display:none'> 本站總訪問量<span id="busuanzi_value_site_pv"></span>次</span>
上面的做法還是很low?!看下這個https://blog.ccswust.org/busuanzi/diy.html右鍵看下源碼,沒加載出來前就顯示個菊花轉轉轉:首先,你要引入font-awesome字體:
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">或<link rel="stylesheet" href="//cdn.bootcss.com/font-awesome/4.3.0/css/font-awesome.min.css">
其次,修改不蒜子標簽:
<span id="busuanzi_value_page_pv"><i class="fa fa-spinner"></i></span> Hits或(旋轉效果)<span id="busuanzi_value_page_pv"><i class="fa fa-spinner fa-spin"></i></span> Hits
和諧多了!
5、我的網站已經運行一段時間了,想初始化訪問次數怎么辦?請先注冊登錄,自行修改閱讀次數。有任何其他問題或疑問可以留言。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。