2010-04-06 113 views
12

我正在尋找一個Java庫來幫助解析用戶輸入的代表日曆應用程序的「約會」的文本。例如:約會的自然語言解析?

午餐與麥克11:30週二

17:00歡樂時光週五

,我發現了一些好的苗頭像https://github.com/samtingleff/jchronichttp://www.datejs.com/這可以解析日期 - 但我也需要能夠提取事件的標題,如「與邁克午餐」。

如果這樣的API不存在,我也有興趣從編碼的角度來看如何最好地處理這個問題。

+0

可能重複(HTTP分佈:/ /stackoverflow.com/questions/1410408/natural-language-date-and-time-parser-for-java) – nawfal 2014-01-30 08:18:14

回答

0

我不能想到任何事情會在我的頭頂,這將符合您的規格。您可以嘗試Stanford NLP Java包或OpenNLP。然而,這可能是你想要做的事情的大錘解決方案。

或者,您可以嘗試自己解析它。如果要處理更多輸入,請使用JFlex掃描輸入並標記化,並使用CUP創建語法。

9

擴展JChronic可能是你最好的選擇。我認爲,鑑於對this question的迴應,爲此存在一個預先構建的庫是不太可能的(儘管看起來這樣的事情可能有用......我猜測解析自然語言日期的主要用例是如果他們有能力從用戶提供的字符串中提取更多數據,那麼它們會更有用)。執行方面,可能是最直接的做法是擴展JChronic,因爲它支持你的用例的相當大的一部分,但是更多的不應該被框架忽略。 幸運的是,如果你看看the main class,擴展/修改/包裝parse()方法以支持事件標題的自定義掃描程序應該不會太困難。 (我個人偏好這些將會包裝框架而不是分叉並修改它,因爲這樣可以更容易地從底層代碼的任何改進中受益)。

最終,可能證明最簡單的做法是生成一個正則表達式解析器,它忽略了JChronic試圖捕獲的大部分內容(這意味着要深入熟悉JChronic源代碼)。

與任何NLP類型的項目一樣,成功實現這一點的關鍵在於儘可能多地獲取例子,最好是作爲自動化單元測試(最終,即使測試用例測試多次複製相同的功能,最好有更多的例子而不是更少的例子)。幸運的是,由於我們談論的是自然語言,因此這些測試用例應該特別容易獲得,因爲即使是非程序員的朋友,家人等也應該能夠爲您提供「事件描述」(或者您想要調用的任何內容他們)。您還需要特別關注日期解析位可能會干擾位置/標題解析位的邊緣情況(例如,在「晚上8點的時候」,「at」顯然是時間的一部分,而在「派對在菲比的星期六「顯然不是)。

我意識到我對JChronic有很多瞭解,但是我覺得這是你的問題的一個自然選擇,因爲它已經涵蓋了很多解析自然語言「約會」的「難題」,即模糊性我們使用的關於時間的語言,並且已經以您要定位的語言實施。

2

嘗試提取約會名稱有兩種相對直接的方式。

使用序列標籤封裝

如果你有標記的數據集,你可以訓練序列模型,使用包像CRF++Yamcha,拉出像「午餐與麥克」預約標題。

使用命名實體和規則

如果沒有標記的數據集,你很可能得到一些milage出使用named entity recognizer標記所有的人,地點和組織在約會文本。作爲獎勵,這也會給你時間&日期,所以你不需要編寫自己的代碼來把它們拉出來。對於所有標記的命名實體而言,編寫一些規則以提取或構建每個約會的標題應該是相當直接的。

如果你正在尋找一個基於Java NER惡搞,你可以使用一個由Stanford釋放,或者一個與OpenNLP

[自然語言的日期和時間解析器的java]的