文字處理簡介:讓我們在 Python 中快速製作字典(第 1 部分)

目錄
[第 1 部分]
[第 2 部分]
[第 3 部分]
[第 4 部分]
文本處理的重要性
我叫 Kawakami,來自高電社開發辦公室。
目前,使用神經網路的自然語言處理正在蓬勃發展。
Takadensha 還利用了傳統基於規則的翻譯 (RBMT) 和統計翻譯 (SMT) 中培養的技術。
我們正在研究神經翻譯 (NMT),這是神經網路的一項應用任務。
在自然語言處理領域,作為 warp 線程的一項重要技術是文本處理。
這次作為文本處理的介紹,對於對 Python 有一定瞭解的人來說,是字典程式
我們將向您展示如何製作它。 我們的目標是使實施盡可能簡單實用。
本文中的示例程式在 jupyter-notebook 上使用 Python 3.6.x。
什麼是字典查找(本文涵蓋的內容)
字典查找程式的目的是將文本數據(例如,維琪百科文章)轉換為
所需的字串 (headword; 例如,Wikipedia 是對標題字串的搜索)。
為簡單起見,讓我們考慮對 headword 進行完全匹配搜索。
當您搜尋文字數據並點擊事先在字典中註冊的一串標題詞時
它顯示預先註冊的單詞的含義。 有關此含義的更多資訊,請參閱
資料庫(尤其是非關係資料庫,如鍵值儲存)
拯救它是可以想像的。 我把這個留到下次再說,但這次
我們將只關注 「搜索」 的前半部分,並瞭解搜索索引的工作原理。
注意:如果您已經瞭解了大致的思路,並且只想閱讀有關程式設計的知識,
請跳過下面的故事,從「雙精度陣列的 Python 實現 (1)」 開始。
Trie Tree (TRIE) 的基本概念
當談到搜索字串匹配項時,首先想到的是關聯陣列。
Python 標準 dict 也是如此。 關於今年的主題,我還想記住一件事
Trie 是一棵樹 (trie)。 它不包含在 Python 的標準庫中,所以讓我們製作它。
現在,讓我們看一下下圖中的 Trie 樹示例。 “*” 是單詞末尾的地標。
讓我們數一數存儲了多少個單詞。
讓我們從根轉到 “*”。
有六個詞:“den”、“where”、“don”、“don-chan”、“don-don”、“donbe”和“donbe”。
↓ 的尖端是子節點 (node),代表下一個字元,相鄰的方格是
表示在同級節點中相同位置的字元選擇。
嚴格來說,我們認為“一個節點通過字元數據過渡到下一個節點”,所以
字元數據寫入箭頭處。 (有關更多資訊,請參閱學術書籍。
為了更容易實現,讓我們把它做成一棵二叉樹。
它比第一個數位更讓人類感到困惑,但基本原理是相同的。 在此圖的 Trie 樹中,
左側的 “↓” 的尖端是子節點,右側的 “↓” 的尖端是同級節點。
標有 “*” 的節點稱為葉節點。
這樣,您可以通過從根節點到葉節點一個接一個地搜索字元來查找字典。
讓我們考慮一下實現。 首先,為節點創建一個類。 作為會員:
左側節點的索引號
右側節點的索引號
- 節點的字元資料(或其字元代碼)
・ 在葉節點的情況下,單詞含義中的數據記錄的編號(例如,當它不是葉節點時為 -1)
如果能有更多就好了。 接下來,我們將創建一個 Trie 樹類。
首先,讓我們將節點(上圖中的13個)作為一個陣列。
剩下的就是編寫一個在 Trie 樹中註冊和搜索節點的方法 (?)。 )
即使採用如此簡單的設計和實現,也可以進行高速搜索,並且可以用於自然語言處理的各種任務。
足夠有用。 當我處理大量的文本數據時,我經常使用 Python 或 C++11。
我曾經編寫和使用這樣的 Trie 樹程式。
關於 Double Array
現在,事情是這樣的。 Trie 樹有多種設計和實現。
目前主流的演算法稱為 double array。
它被提出已有 20 多年的歷史,但理解的門檻有點高。
直到最近幾年,我認為它一直被視為“專家喜歡的工具”。
現在,我可以閱讀一個非常易於理解的解釋,並且已經被咀嚼過了,所以我可以把它提供給公眾(簡單地說,
這是一項即使是像我這樣理解正常的人也可以接觸到的技術。
“資訊科學碩士學位可以理解的雙重安排”
http://d.hatena.ne.jp/takeda25/20120219/1329634865
在一篇易於理解的解釋性文章中,也可以在網路上閱讀,這是一個先驅。
“形態學分析的理論與實施”
https://www.amazon.co.jp/dp/4764905779
形態學分析的聖經。 第 4 章有幾頁,但有一個很好的解釋。