如何按常見主題對字符串進行分組?
例如,我試圖將有關編程的字符串與有關編程的其他字符串、有關物理的字符串與有關物理的其他字符串等進行分組,以涵蓋廣泛的主題。儘管問題的理論語言方面很明顯,但我希望使用編程/軟件實際做到這一點。
**概要:**給定大量字符串,我將如何按語義主題對它們進行分組?
**特定應用:**我有大約 20 萬個瑣事問題,我想將它們分類為常見的分組(汽車、計算機、政治、加拿大、食品、巴拉克奧巴馬等)。
**我研究過的內容:**維基百科有一個自然語言處理工具包列表(假設我正在嘗試做的實際上稱為 NLP),所以我查看了一些,但似乎沒有一個能滿足我的需求。
**注意:**有人指出,這樣做需要額外的知識(例如,保時捷是汽車,C++ 是一種編程語言)。我假設需要訓練數據,但如果我只有問題和答案列表,我該如何生成訓練數據?然後我如何使用訓練數據?
**更多註釋:**如果我的問答的當前格式有幫助(雖然它看起來像 JSON,但它基本上是一個原始文本文件):
// row 1: is metadata // row 2: is a very specific kind of "category" // row 3: is the question // row 4: is the answer { 15343 A MUSICAL PASTICHE Of classical music's "three B's", he was the one born in Hamburg in 1833 Johannes Brahms }
但在有人指出已經存在一個類別之前,請注意有大約 20 萬個這樣的問題和答案,並且基本上有很多“類別”。我正在嘗試將這些分組到更廣泛的組中,例如上面列出的組。此外,可以很容易地為所有問題更改此格式,我以編程方式進行。
**還有更多注意事項:**我實際上不知道我需要多少個類別(至少 10-20 個),因為我自己還沒有通讀所有問題。我部分期望在分類過程中以某種方式確定有限數量。無論如何,我總是可以手動創建多個類別。
這是 NLP 中一個相當標準的問題,您正在尋找的神奇的 Google 詞是“主題建模”。儘管您的字符串很短,但您可能會使用Latent Dirichlet Allocation或類似方法取得一些成功。這裡有 Edwin Chen 的一篇不錯的博客文章,闡述了算法背後的總體思路。Yi Wang的這篇筆記中介紹了實施的細節。
如果您正在尋找現成的解決方案,我建議您試用
topicmodels
R 包,因為它為 LDA 和更複雜的相關主題模型提供了相當不錯的接口。還有一個很好的實現列表,由 David Mimno維護。