2011-04-03 53 views
3

我需要在基於C#的桌面應用程序的用戶的各種文本輸入做一些自然語言處理。爲此我正在使用Antelope。第一步是將文本分割成句子。遵循Antelope提供的文檔,我使用了:Proxem的羚羊:找不到接口「ISentenceSplitter」

using Proxem.Antelope; 
using Proxem.Antelope.Lexicon; 
using Proxem.Antelope.Tools; 
using Proxem.Antelope.LinkGrammar; 
using Proxem.Antelope.Stanford; 
using NUnit.Framework; 
... 
... 
... 
ISentenceSplitter splitter = new Tools.MIL_HtmlSentenceSplitter(); 
splitter.Text = text; 
foreach (string sentence in splitter.Sentences) 
{ 
    // Process sentence… 
} 

此外,我還添加了對這些庫的引用。但它給人的錯誤

The type or namespace name 'ISentenceSplitter' could not be found (are you missing a using directive or an assembly reference?) C:\Users\... 

The type or namespace name 'Tools' could not be found (are you missing a using directive or an assembly reference?) C:\Users\... 

我似乎無法找出解決方案。在網上搜索後,我發現其他人也有這個問題,但沒有人能真正找到解決方案。你能幫我一下嗎?

+1

爲了我自己的好奇心,我下載並嘗試使用庫。看起來非常強大,但非常非常不完善(只有一個PDF格式的數千個庫函數)。我四處探索,但無法爲我的生活找到正確的界面或MIL功能的任何標誌。我會說,如果你不是太投入這個東西去嘗試另一個圖書館! – jonsca 2011-04-04 18:00:12

+0

@jonsca你的確很對。我終於決定放棄現在這個圖書館。早些時候,我想知道爲什麼這個圖書館不是那麼受歡迎,但它又如此強大以及免費。現在我明白這是由於其糟糕的文檔。我現在想用SharpNLP來代替。 http://sharpnlp.codeplex.com/ – 2011-04-09 08:48:31

+0

SharpNLP不再活躍。 在.Net項目中使用OpenNLP的解決方案如下:https://cwiki.apache.org/OPENNLP/a-quick-guide-to-using-opennlp-from-net.html – nicolaspanel 2012-06-24 21:02:04

回答

2

簡單的答案是避免使用這個庫。作者沒有冒犯他們,他們可能已經完成了良好的工作,但如果在各種可能的嘗試之後無法使用它,那麼它就沒用了。他們在文檔中提到一個函數屬於特定的接口,但是當你去那裏時,它不存在於任何可用的接口中。

對於那些很好奇的人:我確實通過他們的網站與作者聯繫過,但即使在8天后也沒有得到答覆。

還有其他的選擇可用,像OpenNLP(Java)或其C#對應SharpNLP

+0

因爲SharpNLP似乎被放棄了,請嘗試OpenNLP.NET - https://github.com/sergey-tihon /OpenNLP.NET – 2015-09-01 16:28:53

1

我有同樣的問題。它源於羚羊dll與 .net framework 2.0兼容的事實,並且您的應用程序被設置爲使用.net 4.0。 (可能) 我將應用程序更改爲.net 2.0,麻煩消失。 :)

另外,我已經使用SharpNLP和羚羊。羚羊有一些優越的功能,如 摺疊檢測和端口到wordnet,我沒有看到在SharpNLP。

祝你好運。

0

很簡單的回答這個:ISentenceSplitter不在實際版本中。我有v 0.8.7這應該是相同的免費 2009版每個人都有爲了確認這一點,我做了

grep -r ISentenceSplitter . 

並沒有回來。嘗試grep與另一個存在的接口,如ILexicon,你會看到所有包含ILexicon的dll。

請注意,我們正在討論免費版本,Proxem和其他合理的公司一樣,希望將其技術推廣爲有利可圖的企業。因此,您必須對自己擁有的東西感到滿意,查看付費解決方案,使用其他方法或編寫您自己的圖書館,這是社區很樂意擁有的。

0

我遇到了同樣的錯誤。薩利胡有實際正確的答案。 這不是如何找到或使用ISentenceSplitter的答案;然而,它確實顯示了Proxem的示例應用程序如何將句子拆分爲更大的流程的一部分。

隨庫一起提供的示例應用程序可以分割句子,所以我認爲代碼允許它。在閱讀了一段代碼之後,我發現他們的例子使用Proxem.Antelope.Document類來進行句子拆分和句法分析。看看Document構造函數的使用ISentenceSplitter(我相當確信它的確如此),而不是反編譯這些庫,我只是使用了這個類,它實際上最終執行了我需要的所有功能,而不僅僅是句子拆分。我絕對建議採取看看他們的榜樣是如何使用它,但這裏是我實現的本質:

public sealed class SyntaxService : ISyntaxService 
{ 
    public SyntaxService(IParser parser, ILexicon lexicon) 
    { 
     m_parser = parser; 
     m_lexicon = lexicon; 

     // These are the setting I needed, YMMV. They seem to add a lot of UI logic to this method :(
     m_processingResources = new ProcessingResources(m_lexicon, null, null, m_parser, 5, null, false, null, null, null, null, false); 
    } 

    public IEnumerable<Sentence> GetSentences(string s) 
    { 
     IDocument document = new Document(s, m_processingResources); 

     return document.Select(Mappers.SentenceMapper.Map); 
    } 

    readonly IParser m_parser; 
    readonly ILexicon m_lexicon; 
    readonly IProcessingResources m_processingResources; 
} 

此處引用的Sentence類是與原句值一起簡單的語法樹。如果你對這種依賴注入友好的包裝和映射不感興趣,你可以使用GetSentences(string)的內核。