讓我們看看可以用在你自己的 NLP 應用中的十幾個工具吧。
在過去的幾年裡,自然語言處理(NLP)推動了聊天機器人、語音助手、文字預測等這些滲透到我們的日常生活中的語音或文字應用程技術的發展。目前有著各種各樣開源的 NLP 工具,所以我決定調查一下當前開源的 NLP 工具來幫助你制定開發下一個基於語音或文字的應用程式的計劃。
儘管我並不熟悉所有工具,但我將從我所熟悉的程式語言出發來介紹這些工具(對於我不熟悉的語言,我無法找到大量的工具)。也就是說,出於各種原因,我排除了三種我熟悉的語言之外的工具。
R 語言可能是沒有被包含在內的最重要的語言,因為我發現的大多數庫都有一年多沒有更新了。這並不一定意味著它們沒有得到很好的維護,但我認為它們應該得到更多的更新,以便和同一領域的其他工具競爭。我還選擇了最有可能用在生產場景中的語言和工具(而不是在學術界和研究中使用),而我主要是使用 R 作為研究和發現工具。
我也驚訝地發現 Scala 的很多庫都沒有更新了。我上次使用 Scala 已經過去了兩年了,當時它非常流行。但是大多數庫從那個時候就再沒有更新過,或者只有少數一些有更新。
最後,我排除了 C++。 這主要是因為我上次使用 C++ 編寫程式已經有很多年了,而我所工作的組織還沒有將 C++ 用於 NLP 或任何資料科學方面的工作。
毋庸置疑,自然語言工具包(NLTK)是我調研過的所有工具中功能最完善的一個。它幾乎實現了自然語言處理中多數功能元件,比如分類、令牌化、詞幹化、標註、分詞和語意推理。每一個都有多種不同的實現方式,所以你可以選擇具體的演算法和方式。同時,它也支援不同的語言。然而,它以字串的形式表示所有的資料,對於一些簡單的資料結構來說可能很方便,但是如果要使用一些高階的功能來說就可能有點困難。它的使用文件有點複雜,但也有很多其他人編寫的使用文件,比如這本很棒的書。和其他的工具比起來,這個工具庫的執行速度有點慢。但總的來說,這個工具包非常不錯,可以用於需要具體演算法組合的實驗、探索和實際應用當中。
SpaCy 可能是 NLTK 的主要競爭者。在大多數情況下都比 NLTK 的速度更快,但是 SpaCy 的每個自然語言處理的功能元件只有一個實現。SpaCy 把所有的東西都表示為一個物件而不是字串,從而簡化了應用構建介面。這也方便它與多種框架和資料科學工具的整合,使得你更容易理解你的文字資料。然而,SpaCy 不像 NLTK 那樣支援多種語言。它確實介面簡單,具有簡化的選項集和完備的文件,以及用於語言處理和分析各種元件的多種神經網路模型。總的來說,對於需要在生產中表現出色且不需要特定演算法的新應用程式,這是一個很不錯的工具。
TextBlob 是 NLTK 的一個擴充套件庫。你可以通過 TextBlob 用一種更簡單的方式來使用 NLTK 的功能,TextBlob 也包括了 Pattern 庫中的功能。如果你剛剛開始學習,這將會是一個不錯的工具,可以用於對效能要求不太高的生產環境的應用。總體來說,TextBlob 適用於任何場景,但是對小型專案尤佳。
這個工具是我用過的名字最好聽的。先重讀“ex”再帶出“cy”,多讀“Textacy”幾次試試。它不僅僅是名字讀起來好,同時它本身也是一個很不錯的工具。它使用 SpaCy 作為它自然語言處理核心功能,但它在處理過程的前後做了很多工作。如果你想要使用 SpaCy,那麼最好使用 Textacy,從而不用去編寫額外的附加程式碼就可以處理不同種類的資料。
PyTorch-NLP 才出現短短的一年,但它已經有一個龐大的社群了。它適用於快速原型開發。當出現了最新的研究,或大公司或者研究人員推出了完成新奇的處理任務的其他工具時,比如影象轉換,它就會被更新。總體來說,PyTorch 的目標使用者是研究人員,但它也能用於原型開發,或使用最先進演算法的初始生產載荷中。基於此基礎上的建立的庫也是值得研究的。
Retext 是 Unified 集合的一部分。Unified 是一個介面,能夠整合不同的工具和外掛以便它們能夠高效的工作。Retext 是 Unified 工具中使用的三種語法之一,另外的兩個分別是用於 Markdown 的 Remark 和用於 HTML 的 Rehype。這是一個非常有趣的想法,我很高興看到這個社群的發展。Retext 沒有涉及很多的底層技術,更多的是使用外掛去完成你在 NLP 任務中想要做的事情。拼寫檢查、字形修復、情緒檢測和增強可讀性都可以用簡單的外掛來完成。總體來說,如果你不想了解底層處理技術又想完成你的任務的話,這個工具和社群是一個不錯的選擇。
Compromise 顯然不是最複雜的工具,如果你正在找擁有最先進的演算法和最完備的系統的話,它可能不適合你。然而,如果你想要一個效能好、功能廣泛、還能在用戶端執行的工具的話,Compromise 值得一試。總體來說,它的名字(“折中”)是準確的,因為作者更關注更具體功能的小軟體包,而在功能性和準確性上有所折中,這些小軟體包得益於使用者對使用環境的理解。
Natural 包含了常規自然語言處理庫所具有的大多數功能。它主要是處理英文文字,但也包括一些其它語言,它的社群也歡迎支援其它的語言。它能夠進行令牌化、詞幹化、分類、語音處理、詞頻-逆文件頻率計算(TF-IDF)、WordNet、字元相似度計算和一些變換。它和 NLTK 有的一比,因為它想要把所有東西都包含在一個包裡頭,但它更易於使用,而且不一定專注於研究。總的來說,這是一個非常完整的庫,目前仍在活躍開發中,但可能需要對底層實現有更多的了解才能完全發揮效力。
Nlp.js 建立在其他幾個 NLP 庫之上,包括 Franc 和 Brain.js。它為許多 NLP 元件提供了一個很好的介面,比如分類、情感分析、詞幹化、命名實體識別和自然語言生成。它也支援一些其它語言,在你處理英語之外的語言時能提供一些幫助。總之,它是一個不錯的通用工具,並且提供了呼叫其他工具的簡化介面。在你需要更強大或更靈活的工具之前,這個工具可能會在你的應用程式中用上很長一段時間。
OpenNLP 是由 Apache 基金會管理的,所以它可以很方便地整合到其他 Apache 專案中,比如 Apache Flink、Apache NiFi 和 Apache Spark。這是一個通用的 NLP 工具,包含了所有 NLP 元件中的通用功能,可以通過命令列或者以包的形式匯入到應用中來使用它。它也支援很多種語言。OpenNLP 是一個很高效的工具,包含了很多特性,如果你用 Java 開發生產環境產品的話,它是個很好的選擇。
Stanford CoreNLP 是一個工具集,提供了統計 NLP、深度學習 NLP 和基於規則的 NLP 功能。這個工具也有許多其他程式語言的版本,所以可以脫離 Java 來使用。它是由高水平的研究機構建立的一個高效的工具,但在生產環境中可能不是最好的。此工具採用雙許可證,具有可以用於商業目的的特定許可證。總之,在研究和實驗中它是一個很棒的工具,但在生產系統中可能會帶來一些額外的成本。比起 Java 版本來說,讀者可能對它的 Python 版本更感興趣。同樣,在 Coursera 上最好的機器學習課程之一是斯坦福教授提供的,點此存取其他不錯的資源。
CogCompNLP 由伊利諾斯大學開發的一個工具,它也有一個相似功能的 Python 版本。它可以用於處理文字,包括本地處理和遠端處理,能夠極大地緩解你本地裝置的壓力。它提供了很多處理功能,比如令牌化、詞性標注、斷句、命名實體標註、詞型還原、依存分析和語意角色標註。它是一個很好的研究工具,你可以自己探索它的不同功能。我不確定它是否適合生產環境,但如果你使用 Java 的話,它值得一試。
你最喜歡的開源 NLP 工具和庫是什麼?請在評論區分享文中沒有提到的工具。