使用 TensorFlow 實現文字轉語音 Tacotron


Tacotron 是完全端到端的文本到語音合成模型,主要是將文本轉化為語音,使用了預訓練模型(pre-trained)技術。

Tacotron 可利用文本生成類似真人的語音,建議安裝 Python 3 版本。

使用 pre-trained 模型

下載和解壓模型

curl http://data.keithito.com/data/speech/tacotron-20170720.tar.bz2 | tar xjC /tmp

 

運行 demo server

python3 demo_server.py --checkpoint /tmp/tacotron-20170720/model.ckpt

 

訪問 localhost:9000

輸入你想要合成的東西

 ===============================
自然語言處理 NLP ,人機交互的語言分析

現如今,人工智能已經成為大眾耳熟能詳的詞匯,而自然語言處理卻很少有人了解。自然語言處理(Natural Language Processing,NLP)屬於人工智能的一個子領域,是指用計算機對自然語言的形、音、義等信息進行處理,即對字、詞、句、篇章的輸入、輸出、識別、分析、理解、生成等的操作和加工。它對計算機和人類的交互方式有許多重要的影響。

人類語言經過數千年的發展,已經成為一種微妙的交流形式,承載着豐富的信息,這些信息往往超越語言本身。自然語言處理將成為填補人類通信與數字數據鴻溝的一項重要技術。下面就介紹一下自然語言處理的幾個常見應用:

 1、機器翻譯

隨着通信技術與互聯網技術的飛速發展、信息的急劇增加以及國際聯系愈加緊密,讓世界上所有人都能跨越語言障礙獲取信息的挑戰已經超出了人類翻譯的能力范圍。

機器翻譯因其效率高、成本低滿足了全球各國多語言信息快速翻譯的需求。機器翻譯屬於自然語言信息處理的一個分支,能夠將一種自然語言自動生成另一種自然語言又無需人類幫助的計算機系統。目前,谷歌翻譯、百度翻譯、搜狗翻譯等人工智能行業巨頭推出的翻譯平台逐漸憑借其翻譯過程的高效性和准確性占據了翻譯行業的主導地位。

 2、打擊垃圾郵件

當前,垃圾郵件過濾器已成為抵御垃圾郵件問題的第一道防線。不過,有許多人在使用電子郵件時遇到過這些問題:不需要的電子郵件仍然被接收,或者重要的電子郵件被過濾掉。事實上,判斷一封郵件是否是垃圾郵件,首先用到的方法是“關鍵詞過濾”,如果郵件存在常見的垃圾郵件關鍵詞,就判定為垃圾郵件。但這種方法效果很不理想,一是正常郵件中也可能有這些關鍵詞,非常容易誤判,二是將關鍵詞進行變形,就很容易規避關鍵詞過濾。

自然語言處理通過分析郵件中的文本內容,能夠相對准確地判斷郵件是否為垃圾郵件。目前,貝葉斯(Bayesian)垃圾郵件過濾是備受關注的技術之一,它通過學習大量的垃圾郵件和非垃圾郵件,收集郵件中的特征詞生成垃圾詞庫和非垃圾詞庫,然后根據這些詞庫的統計頻數計算郵件屬於垃圾郵件的概率,以此來進行判定。

 3、信息提取

金融市場中的許多重要決策正日益脫離人類的監督和控制。算法交易正變得越來越流行,這是一種完全由技術控制的金融投資形式。但是,這些財務決策中的許多都受到新聞的影響。因此,自然語言處理的一個主要任務是獲取這些明文公告,並以一種可被納入算法交易決策的格式提取相關信息。例如,公司之間合並的消息可能會對交易決策產生重大影響,將合並細節(包括參與者、收購價格)納入到交易算法中,這或將帶來數百萬美元的利潤影響。

 4、文本情感分析

在數字時代,信息過載是一個真實的現象,我們獲取知識和信息的能力已經遠遠超過了我們理解它的能力。並且,這一趨勢絲毫沒有放緩的跡象,因此總結文檔和信息含義的能力變得越來越重要。情感分析作為一種常見的自然語言處理方法的應用,可以讓我們能夠從大量數據中識別和吸收相關信息,而且還可以理解更深層次的含義。比如,企業分析消費者對產品的反饋信息,或者檢測在線評論中的差評信息等。

 5、自動問答

隨着互聯網的快速發展,網絡信息量不斷增加,人們需要獲取更加精確的信息。傳統的搜索引擎技術已經不能滿足人們越來越高的需求,而自動問答技術成為了解決這一問題的有效手段。自動問答是指利用計算機自動回答用戶所提出的問題以滿足用戶知識需求的任務,在回答用戶問題時,首先要正確理解用戶所提出的問題,抽取其中關鍵的信息,在已有的語料庫或者知識庫中進行檢索、匹配,將獲取的答案反饋給用戶。

6、個性化推薦

自然語言處理可以依據大數據和歷史行為記錄,學習出用戶的興趣愛好,預測出用戶對給定物品的評分或偏好,實現對用戶意圖的精准理解,同時對語言進行匹配計算,實現精准匹配。例如,在新聞服務領域,通過用戶閱讀的內容、時長、評論等偏好,以及社交網絡甚至是所使用的移動設備型號等,綜合分析用戶所關注的信息源及核心詞匯,進行專業的細化分析,從而進行新聞推送,實現新聞的個人定制服務,最終提升用戶粘性。

寫在最后:

自然語言處理的目標是彌補人類交流(自然語言)與計算機理解(機器語言)之間的差距,最終實現計算機在理解自然語言上像人類一樣智能。未來,自然語言處理的發展將使人工智能可以逐漸面對更加復雜的情況、解決更多的問題,也必將為我們帶來一個更加智能化的時代。

========================================

本文簡要介紹Python自然語言處理(NLP),使用Python的NLTK庫。NLTK是Python的自然語言處理工具包,在NLP領域中,最常使用的一個Python庫。

什么是NLP?

簡單來說,自然語言處理(NLP)就是開發能夠理解人類語言的應用程序或服務。

這里討論一些自然語言處理(NLP)的實際應用例子,如語音識別、語音翻譯、理解完整的句子、理解匹配詞的同義詞,以及生成語法正確完整句子和段落。

這並不是NLP能做的所有事情。

NLP實現

搜索引擎: 比如谷歌,Yahoo等。谷歌搜索引擎知道你是一個技術人員,所以它顯示與技術相關的結果;

社交網站推送:比如Facebook News Feed。如果News Feed算法知道你的興趣是自然語言處理,就會顯示相關的廣告和帖子。

語音引擎:比如Apple的Siri。

垃圾郵件過濾:如谷歌垃圾郵件過濾器。和普通垃圾郵件過濾不同,它通過了解郵件內容里面的的深層意義,來判斷是不是垃圾郵件。

NLP庫

下面是一些開源的自然語言處理庫(NLP):

Natural language toolkit (NLTK);
Apache OpenNLP;
Stanford NLP suite;
Gate NLP library

其中自然語言工具包(NLTK)是最受歡迎的自然語言處理庫(NLP),它是用Python編寫的,而且背后有非常強大的社區支持。

NLTK也很容易上手,實際上,它是最簡單的自然語言處理(NLP)庫。

在這個NLP教程中,我們將使用Python NLTK庫。

安裝 NLTK

如果您使用的是Windows/Linux/Mac,您可以使用pip安裝NLTK:

pip install nltk

打開python終端導入NLTK檢查NLTK是否正確安裝:

import nltk

如果一切順利,這意味着您已經成功地安裝了NLTK庫。首次安裝了NLTK,需要通過運行以下代碼來安裝NLTK擴展包:

import nltk

nltk.download()

這將彈出NLTK 下載窗口來選擇需要安裝哪些包:

您可以安裝所有的包,因為它們的大小都很小,所以沒有什么問題。

使用Python Tokenize文本

首先,我們將抓取一個web頁面內容,然后分析文本了解頁面的內容。

我們將使用urllib模塊來抓取web頁面:

import urllib.request

response = urllib.request.urlopen('http://php.net/')
html = response.read()
print (html)

從打印結果中可以看到,結果包含許多需要清理的HTML標簽。

然后BeautifulSoup模塊來清洗這樣的文字:

from bs4 import BeautifulSoup

import urllib.request
response = urllib.request.urlopen('http://php.net/')
html = response.read()
soup = BeautifulSoup(html,"html5lib")

這需要安裝html5lib模塊
text = soup.get_text(strip=True)
print (text)

現在我們從抓取的網頁中得到了一個干凈的文本。

下一步,將文本轉換為tokens,像這樣:

from bs4 import BeautifulSoup
import urllib.request

response = urllib.request.urlopen('http://php.net/')
html = response.read()
soup = BeautifulSoup(html,"html5lib")
text = soup.get_text(strip=True)
tokens = text.split()
print (tokens)

統計詞頻

text已經處理完畢了,現在使用Python NLTK統計token的頻率分布。

可以通過調用NLTK中的FreqDist()方法實現:

from bs4 import BeautifulSoup
import urllib.request
import nltk

response = urllib.request.urlopen('http://php.net/')
html = response.read()
soup = BeautifulSoup(html,"html5lib")
text = soup.get_text(strip=True)
tokens = text.split()
freq = nltk.FreqDist(tokens)
for key,val in freq.items():
print (str(key) + ':' + str(val))

如果搜索輸出結果,可以發現最常見的token是PHP。

您可以調用plot函數做出頻率分布圖:

freq.plot(20, cumulative=False)
# 需要安裝matplotlib庫

這上面這些單詞。比如of,a,an等等,這些詞都屬於停用詞。

一般來說,停用詞應該刪除,防止它們影響分析結果。

處理停用詞

NLTK自帶了許多種語言的停用詞列表,如果你獲取英文停用詞:

from nltk.corpus import stopwords

stopwords.words('english')

現在,修改下代碼,在繪圖之前清除一些無效的token:

clean_tokens = list()
sr = stopwords.words('english')
for token in tokens:
if token not in sr:
clean_tokens.append(token)

最終的代碼應該是這樣的:

from bs4 import BeautifulSoup
import urllib.request
import nltk
from nltk.corpus import stopwords

response = urllib.request.urlopen('http://php.net/')
html = response.read()
soup = BeautifulSoup(html,"html5lib")
text = soup.get_text(strip=True)
tokens = text.split()
clean_tokens = list()
sr = stopwords.words('english')
for token in tokens:
if not token in sr:
clean_tokens.append(token)
freq = nltk.FreqDist(clean_tokens)
for key,val in freq.items():
print (str(key) + ':' + str(val))

現在再做一次詞頻統計圖,效果會比之前好些,因為剔除了停用詞:

freq.plot(20,cumulative=False)


使用NLTK Tokenize文本

在之前我們用split方法將文本分割成tokens,現在我們使用NLTK來Tokenize文本。

文本沒有Tokenize之前是無法處理的,所以對文本進行Tokenize非常重要的。token化過程意味着將大的部件分割為小部件。

你可以將段落tokenize成句子,將句子tokenize成單個詞,NLTK分別提供了句子tokenizer和單詞tokenizer。

假如有這樣這段文本:

Hello Adam, how are you? I hope everything is going well. Today is a good day, see you dude

使用句子tokenizer將文本tokenize成句子:

from nltk.tokenize import sent_tokenize

mytext = "Hello Adam, how are you? I hope everything is going well. Today is a good day, see you dude."
print(sent_tokenize(mytext))

輸出如下:

['Hello Adam, how are you?', 'I hope everything is going well.', 'Today is a good day, see you dude.']

這是你可能會想,這也太簡單了,不需要使用NLTK的tokenizer都可以,直接使用正則表達式來拆分句子就行,因為每個句子都有標點和空格。

那么再來看下面的文本:

Hello Mr. Adam, how are you? I hope everything is going well. Today is a good day, see you dude.

這樣如果使用標點符號拆分,Hello Mr將會被認為是一個句子,如果使用NLTK:

from nltk.tokenize import sent_tokenize

mytext = "Hello Mr. Adam, how are you? I hope everything is going well. Today is a good day, see you dude."
print(sent_tokenize(mytext))

輸出如下:

['Hello Mr. Adam, how are you?', 'I hope everything is going well.', 'Today is a good day, see you dude.']

這才是正確的拆分。

接下來試試單詞tokenizer:

from nltk.tokenize import word_tokenize

mytext = "Hello Mr. Adam, how are you? I hope everything is going well. Today is a good day, see you dude."
print(word_tokenize(mytext))

輸出如下:

['Hello', 'Mr.', 'Adam', ',', 'how', 'are', 'you', '?', 'I', 'hope', 'everything', 'is', 'going', 'well', '.', 'Today', 'is', 'a', 'good', 'day', ',', 'see', 'you', 'dude', '.']

Mr.這個詞也沒有被分開。NLTK使用的是punkt模塊的PunktSentenceTokenizer,它是NLTK.tokenize的一部分。而且這個tokenizer經過訓練,可以適用於多種語言。

非英文Tokenize

Tokenize時可以指定語言:

from nltk.tokenize import sent_tokenize

mytext = "Bonjour M. Adam, comment allez-vous? J'espère que tout va bien. Aujourd'hui est un bon jour."
print(sent_tokenize(mytext,"french"))

輸出結果如下:

['Bonjour M. Adam, comment allez-vous?', "J'espère que tout va bien.", "Aujourd'hui est un bon jour."]

同義詞處理

使用nltk.download()安裝界面,其中一個包是WordNet。

WordNet是一個為自然語言處理而建立的數據庫。它包括一些同義詞組和一些簡短的定義。

您可以這樣獲取某個給定單詞的定義和示例:

from nltk.corpus import wordnet

syn = wordnet.synsets("pain")
print(syn[0].definition())
print(syn[0].examples())

輸出結果是:

a symptom of some physical hurt or disorder
['the patient developed severe pain and distension']

WordNet包含了很多定義:

from nltk.corpus import wordnet

syn = wordnet.synsets("NLP")
print(syn[0].definition())
syn = wordnet.synsets("Python")
print(syn[0].definition())

結果如下:

the branch of information science that deals with natural language information
large Old World boas

可以像這樣使用WordNet來獲取同義詞:

from nltk.corpus import wordnet

synonyms = []
for syn in wordnet.synsets('Computer'):
for lemma in syn.lemmas():
synonyms.append(lemma.name())
print(synonyms)

輸出:

['computer', 'computing_machine', 'computing_device', 'data_processor', 'electronic_computer', 'information_processing_system', 'calculator', 'reckoner', 'figurer', 'estimator', 'computer']

反義詞處理

也可以用同樣的方法得到反義詞:

from nltk.corpus import wordnet

antonyms = []
for syn in wordnet.synsets("small"):
for l in syn.lemmas():
if l.antonyms():
antonyms.append(l.antonyms()[0].name())
print(antonyms)

輸出:

['large', 'big', 'big']

詞干提取

語言形態學和信息檢索里,詞干提取是去除詞綴得到詞根的過程,例如working的詞干為work。

搜索引擎在索引頁面時就會使用這種技術,所以很多人為相同的單詞寫出不同的版本。

有很多種算法可以避免這種情況,最常見的是波特詞干算法。NLTK有一個名為PorterStemmer的類,就是這個算法的實現:

from nltk.stem import PorterStemmer

stemmer = PorterStemmer()
print(stemmer.stem('working'))
print(stemmer.stem('worked'))

輸出結果是:

work
work

還有其他的一些詞干提取算法,比如 Lancaster詞干算法。

非英文詞干提取

除了英文之外,SnowballStemmer還支持13種語言。

支持的語言:

from nltk.stem import SnowballStemmer

print(SnowballStemmer.languages)

'danish', 'dutch', 'english', 'finnish', 'french', 'german', 'hungarian', 'italian', 'norwegian', 'porter', 'portuguese', 'romanian', 'russian', 'spanish', 'swedish'

你可以使用SnowballStemmer類的stem函數來提取像這樣的非英文單詞:

from nltk.stem import SnowballStemmer

french_stemmer = SnowballStemmer('french')

print(french_stemmer.stem("French word"))

單詞變體還原

單詞變體還原類似於詞干,但不同的是,變體還原的結果是一個真實的單詞。不同於詞干,當你試圖提取某些詞時,它會產生類似的詞:

from nltk.stem import PorterStemmer

stemmer = PorterStemmer()

print(stemmer.stem('increases'))

結果:

increas

現在,如果用NLTK的WordNet來對同一個單詞進行變體還原,才是正確的結果:

from nltk.stem import WordNetLemmatizer

lemmatizer = WordNetLemmatizer()

print(lemmatizer.lemmatize('increases'))

結果:

increase

結果可能會是一個同義詞或同一個意思的不同單詞。

有時候將一個單詞做變體還原時,總是得到相同的詞。

這是因為語言的默認部分是名詞。要得到動詞,可以這樣指定:

from nltk.stem import WordNetLemmatizer

lemmatizer = WordNetLemmatizer()

print(lemmatizer.lemmatize('playing', pos="v"))

結果:

play

實際上,這也是一種很好的文本壓縮方式,最終得到文本只有原先的50%到60%。

結果還可以是動詞(v)、名詞(n)、形容詞(a)或副詞(r):

from nltk.stem import WordNetLemmatizer

lemmatizer = WordNetLemmatizer()
print(lemmatizer.lemmatize('playing', pos="v"))
print(lemmatizer.lemmatize('playing', pos="n"))
print(lemmatizer.lemmatize('playing', pos="a"))
print(lemmatizer.lemmatize('playing', pos="r"))

輸出:

play
playing
playing
playing

詞干和變體的區別

通過下面例子來觀察:

from nltk.stem import WordNetLemmatizer
from nltk.stem import PorterStemmer

stemmer = PorterStemmer()
lemmatizer = WordNetLemmatizer()
print(stemmer.stem('stones'))
print(stemmer.stem('speaking'))
print(stemmer.stem('bedroom'))
print(stemmer.stem('jokes'))
print(stemmer.stem('lisa'))
print(stemmer.stem('purple'))
print('----------------------')
print(lemmatizer.lemmatize('stones'))
print(lemmatizer.lemmatize('speaking'))
print(lemmatizer.lemmatize('bedroom'))
print(lemmatizer.lemmatize('jokes'))
print(lemmatizer.lemmatize('lisa'))
print(lemmatizer.lemmatize('purple'))

輸出:

stone
speak
bedroom
joke
lisa

purpl
stone
speaking
bedroom
joke
lisa
purple

詞干提取不會考慮語境,這也是為什么詞干提取比變體還原快且准確度低的原因。

個人認為,變體還原比詞干提取更好。單詞變體還原返回一個真實的單詞,即使它不是同一個單詞,也是同義詞,但至少它是一個真實存在的單詞。

如果你只關心速度,不在意准確度,這時你可以選用詞干提取。

在此NLP教程中討論的所有步驟都只是文本預處理。在以后的文章中,將會使用Python NLTK來實現文本分析。
————————————————
版權聲明:本文為CSDN博主「SinGaln」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_27492735/article/details/78596618


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM