12 種自然語言處理的開源工具
讓我們看看可以用在你自己的 NLP 應(yīng)用中的十幾個(gè)工具吧。-- Dan Barker(作者)
在過去的幾年里,自然語言處理(NLP)推動(dòng)了聊天機(jī)器人、語音助手、文本預(yù)測(cè)等這些滲透到我們的日常生活中的語音或文本應(yīng)用程技術(shù)的發(fā)展。目前有著各種各樣開源的 NLP 工具,所以我決定調(diào)查一下當(dāng)前開源的 NLP 工具來幫助你制定開發(fā)下一個(gè)基于語音或文本的應(yīng)用程序的計(jì)劃。
盡管我并不熟悉所有工具,但我將從我所熟悉的編程語言出發(fā)來介紹這些工具(對(duì)于我不熟悉的語言,我無法找到大量的工具)。也就是說,出于各種原因,我排除了三種我熟悉的語言之外的工具。
R 語言可能是沒有被包含在內(nèi)的最重要的語言,因?yàn)槲野l(fā)現(xiàn)的大多數(shù)庫都有一年多沒有更新了。這并不一定意味著它們沒有得到很好的維護(hù),但我認(rèn)為它們應(yīng)該得到更多的更新,以便和同一領(lǐng)域的其他工具競(jìng)爭(zhēng)。我還選擇了最有可能用在生產(chǎn)場(chǎng)景中的語言和工具(而不是在學(xué)術(shù)界和研究中使用),而我主要是使用 R 作為研究和發(fā)現(xiàn)工具。
我也驚訝地發(fā)現(xiàn) Scala 的很多庫都沒有更新了。我上次使用 Scala 已經(jīng)過去了兩年了,當(dāng)時(shí)它非常流行。但是大多數(shù)庫從那個(gè)時(shí)候就再?zèng)]有更新過,或者只有少數(shù)一些有更新。
最后,我排除了 C++。 這主要是因?yàn)槲疑洗问褂?C++ 編寫程序已經(jīng)有很多年了,而我所工作的組織還沒有將 C++ 用于 NLP 或任何數(shù)據(jù)科學(xué)方面的工作。
Python 工具
自然語言工具包(NLTK)
毋庸置疑, 自然語言工具包(NLTK) 是我調(diào)研過的所有工具中功能最完善的一個(gè)。它幾乎實(shí)現(xiàn)了自然語言處理中多數(shù)功能組件,比如分類、令牌化、詞干化、標(biāo)注、分詞和語義推理。每一個(gè)都有多種不同的實(shí)現(xiàn)方式,所以你可以選擇具體的算法和方式。同時(shí),它也支持不同的語言。然而,它以字符串的形式表示所有的數(shù)據(jù),對(duì)于一些簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu)來說可能很方便,但是如果要使用一些高級(jí)的功能來說就可能有點(diǎn)困難。它的使用文檔有點(diǎn)復(fù)雜,但也有很多其他人編寫的使用文檔,比如 這本很棒的書 。和其他的工具比起來,這個(gè)工具庫的運(yùn)行速度有點(diǎn)慢。但總的來說,這個(gè)工具包非常不錯(cuò),可以用于需要具體算法組合的實(shí)驗(yàn)、探索和實(shí)際應(yīng)用當(dāng)中。
SpaCy
SpaCy 可能是 NLTK 的主要競(jìng)爭(zhēng)者。在大多數(shù)情況下都比 NLTK 的速度更快,但是 SpaCy 的每個(gè)自然語言處理的功能組件只有一個(gè)實(shí)現(xiàn)。SpaCy 把所有的東西都表示為一個(gè)對(duì)象而不是字符串,從而簡(jiǎn)化了應(yīng)用構(gòu)建接口。這也方便它與多種框架和數(shù)據(jù)科學(xué)工具的集成,使得你更容易理解你的文本數(shù)據(jù)。然而,SpaCy 不像 NLTK 那樣支持多種語言。它確實(shí)接口簡(jiǎn)單,具有簡(jiǎn)化的選項(xiàng)集和完備的文檔,以及用于語言處理和分析各種組件的多種神經(jīng)網(wǎng)絡(luò)模型??偟膩碚f,對(duì)于需要在生產(chǎn)中表現(xiàn)出色且不需要特定算法的新應(yīng)用程序,這是一個(gè)很不錯(cuò)的工具。
TextBlob
TextBlob 是 NLTK 的一個(gè)擴(kuò)展庫。你可以通過 TextBlob 用一種更簡(jiǎn)單的方式來使用 NLTK 的功能,TextBlob 也包括了 Pattern 庫中的功能。如果你剛剛開始學(xué)習(xí),這將會(huì)是一個(gè)不錯(cuò)的工具,可以用于對(duì)性能要求不太高的生產(chǎn)環(huán)境的應(yīng)用??傮w來說,TextBlob 適用于任何場(chǎng)景,但是對(duì)小型項(xiàng)目尤佳。
Textacy
這個(gè)工具是我用過的名字最好聽的。先重讀“ex”再帶出“cy”,多讀“ Textacy ”幾次試試。它不僅僅是名字讀起來好,同時(shí)它本身也是一個(gè)很不錯(cuò)的工具。它使用 SpaCy 作為它自然語言處理核心功能,但它在處理過程的前后做了很多工作。如果你想要使用 SpaCy,那么最好使用 Textacy,從而不用去編寫額外的附加代碼就可以處理不同種類的數(shù)據(jù)。
PyTorch-NLP
PyTorch-NLP 才出現(xiàn)短短的一年,但它已經(jīng)有一個(gè)龐大的社區(qū)了。它適用于快速原型開發(fā)。當(dāng)出現(xiàn)了最新的研究,或大公司或者研究人員推出了完成新奇的處理任務(wù)的其他工具時(shí),比如圖像轉(zhuǎn)換,它就會(huì)被更新??傮w來說,PyTorch 的目標(biāo)用戶是研究人員,但它也能用于原型開發(fā),或使用最先進(jìn)算法的初始生產(chǎn)載荷中。基于此基礎(chǔ)上的創(chuàng)建的庫也是值得研究的。
Node.js 工具
Retext
Retext 是 Unified 集合 的一部分。Unified 是一個(gè)接口,能夠集成不同的工具和插件以便它們能夠高效的工作。Retext 是 Unified 工具中使用的三種語法之一,另外的兩個(gè)分別是用于 Markdown 的 Remark 和用于 HTML 的 Rehype。這是一個(gè)非常有趣的想法,我很高興看到這個(gè)社區(qū)的發(fā)展。Retext 沒有涉及很多的底層技術(shù),更多的是使用插件去完成你在 NLP 任務(wù)中想要做的事情。拼寫檢查、字形修復(fù)、情緒檢測(cè)和增強(qiáng)可讀性都可以用簡(jiǎn)單的插件來完成??傮w來說,如果你不想了解底層處理技術(shù)又想完成你的任務(wù)的話,這個(gè)工具和社區(qū)是一個(gè)不錯(cuò)的選擇。
Compromise
Compromise 顯然不是最復(fù)雜的工具,如果你正在找擁有最先進(jìn)的算法和最完備的系統(tǒng)的話,它可能不適合你。然而,如果你想要一個(gè)性能好、功能廣泛、還能在客戶端運(yùn)行的工具的話,Compromise 值得一試??傮w來說,它的名字(“折中”)是準(zhǔn)確的,因?yàn)樽髡吒P(guān)注更具體功能的小軟件包,而在功能性和準(zhǔn)確性上有所折中,這些小軟件包得益于用戶對(duì)使用環(huán)境的理解。
Natural
Natural 包含了常規(guī)自然語言處理庫所具有的大多數(shù)功能。它主要是處理英文文本,但也包括一些其它語言,它的社區(qū)也歡迎支持其它的語言。它能夠進(jìn)行令牌化、詞干化、分類、語音處理、詞頻-逆文檔頻率計(jì)算(TF-IDF)、WordNet、字符相似度計(jì)算和一些變換。它和 NLTK 有的一比,因?yàn)樗胍阉袞|西都包含在一個(gè)包里頭,但它更易于使用,而且不一定專注于研究??偟膩碚f,這是一個(gè)非常完整的庫,目前仍在活躍開發(fā)中,但可能需要對(duì)底層實(shí)現(xiàn)有更多的了解才能完全發(fā)揮效力。
Nlp.js
Nlp.js 建立在其他幾個(gè) NLP 庫之上,包括 Franc 和 Brain.js。它為許多 NLP 組件提供了一個(gè)很好的接口,比如分類、情感分析、詞干化、命名實(shí)體識(shí)別和自然語言生成。它也支持一些其它語言,在你處理英語之外的語言時(shí)能提供一些幫助??傊?,它是一個(gè)不錯(cuò)的通用工具,并且提供了調(diào)用其他工具的簡(jiǎn)化接口。在你需要更強(qiáng)大或更靈活的工具之前,這個(gè)工具可能會(huì)在你的應(yīng)用程序中用上很長(zhǎng)一段時(shí)間。
Java 工具
OpenNLP
OpenNLP 是由 Apache 基金會(huì)管理的,所以它可以很方便地集成到其他 Apache 項(xiàng)目中,比如 Apache Flink、Apache NiFi 和 Apache Spark。這是一個(gè)通用的 NLP 工具,包含了所有 NLP 組件中的通用功能,可以通過命令行或者以包的形式導(dǎo)入到應(yīng)用中來使用它。它也支持很多種語言。OpenNLP 是一個(gè)很高效的工具,包含了很多特性,如果你用 Java 開發(fā)生產(chǎn)環(huán)境產(chǎn)品的話,它是個(gè)很好的選擇。
Stanford CoreNLP
Stanford CoreNLP 是一個(gè)工具集,提供了統(tǒng)計(jì) NLP、深度學(xué)習(xí) NLP 和基于規(guī)則的 NLP 功能。這個(gè)工具也有許多其他編程語言的版本,所以可以脫離 Java 來使用。它是由高水平的研究機(jī)構(gòu)創(chuàng)建的一個(gè)高效的工具,但在生產(chǎn)環(huán)境中可能不是最好的。此工具采用雙許可證,具有可以用于商業(yè)目的的特定許可證??傊?,在研究和實(shí)驗(yàn)中它是一個(gè)很棒的工具,但在生產(chǎn)系統(tǒng)中可能會(huì)帶來一些額外的成本。比起 Java 版本來說,讀者可能對(duì)它的 Python 版本更感興趣。同樣,在 Coursera 上最好的機(jī)器學(xué)習(xí)課程之一是斯坦福教授提供的, 點(diǎn)此 訪問其他不錯(cuò)的資源。
CogCompNLP
CogCompNLP 由伊利諾斯大學(xué)開發(fā)的一個(gè)工具,它也有一個(gè)相似功能的 Python 版本。它可以用于處理文本,包括本地處理和遠(yuǎn)程處理,能夠極大地緩解你本地設(shè)備的壓力。它提供了很多處理功能,比如令牌化、詞性標(biāo)注、斷句、命名實(shí)體標(biāo)注、詞型還原、依存分析和語義角色標(biāo)注。它是一個(gè)很好的研究工具,你可以自己探索它的不同功能。我不確定它是否適合生產(chǎn)環(huán)境,但如果你使用 Java 的話,它值得一試。