2011-11-29 50 views
5

我正在使用Java和Swing GUI在我的空闲时间开发财务经理。当用户添加新条目时,系统会提示他填写:金额,日期,评论和部分(例如汽车,薪金,计算机,食品等)字符串分析和分类

部分创建为“即时”。当用户输入新的部分时,它将被添加到section-jcombobox以供进一步选择。另一点是,评论可以用不同的语言。所以硬编码词和同义词的列表将是巨大的。

所以,我的问题是,是否有可能分析评论(例如“燃料”,“汽车服务”,“午餐在**”)并预选一个适合的部分。 我的第一个想法是,如果用户选择另一个部分,那么使用神经网络并从输入中学习。

但我的问题是,我不知道如何开始。我尝试了Eclipse的“encog”并做了一些教程(XOR,...)。但他们都只使用双打/输出。

任何人都可以给我一个提示如何启动或任何其他可能的解决方案呢?

Here是可运行的JAR(目前的发展状态,需要Java7)和Sourceforge Page

+0

+1不错的问题。 – gprathour

回答

1

忘掉神经网络。这是一个高度技术性和专业化的人工智能领域,它可能不适合您的问题,需要扎实的专业知识。此外,针对您的问题还有很多更简单更好的解决方案。

第一个明显的解决方案,为您的所有部分建立单词和同义词列表并解析这些同义词。然后您可以在线收集关于同义词分析的评论,或者使用解析用户提供的评论/部分来统计检测单词之间的关系等。

有无数种可能的解决方案,从最简单到最多的矫枉过正。现在您需要确定系统的这个功能是否关键(预填充可能不会),以及任何开发工作会带给您什么。一个小时的工作可以带给你80%满意的功能,而90%的目标需要花费一周的工作时间。是不是真的值得吗?

寻求最简单的解决方案,并解决任何开发项目的真正挑战:交付。一旦您的应用程序交付,那么您可以随时返回并根据需要进行改进。

+0

我认为单词列表将过大,由于动态部分创建和可能(JAR +资料来源) –

+0

用我们现代化的机器,我会说没有太大的单词列表这样的东西......即使是同义词词典也可以很容易地适应记忆。 – solendil

+0

是否有可能将所有用过的单词存储在数据库中的除了被阻止的单词(in,and,...)之外的评论中,然后将选定的单元分配给它并且当用户添加评论时,通过(BIG DB)并根据单词的条目选择部分?由于大量的数据,我认为性能会很低。 –

0
String myString = new String(paramInput); 

if(myString.contains("FUEL")){ 
//do the fuel functionality 
} 
+0

请参阅GP Singh的回答 –

0

在一个简单的应用程序,如果你将有只有在应用程序中某些特定部分那么你可以得到从评论字符串,并检查它是否包含一些关键字,然后根据它改变部分的值。

+0

感谢您的答复。但问题是,这些部分是“即时”创建的。当用户输入新的部分时,它将被添加到section-jcombobox以供进一步选择。所以,它不那么容易:(另一件事是,这些评论可以用不同的语言。 –

0

如果您有很多类别,我会使用类似于Apache Lucene的东西,您可以使用它们的名称和可能出现在用户描述中的潜在关键字/短语为所有类别建立索引。然后,您可以简单地通过Lucene运行描述,并使用顶级匹配类别作为“最佳猜测”。

P.S.神经网络的输入和输出将始终是双精度或浮点数,其值在0和1之间。至于如何实现字符串匹配,我甚至不知道从哪里开始。

+0

请参阅评论在GP辛格的答案 –

0

在我看来,那下面会做什么:

  • 硬字统计
  • 也许制止类(英语/西班牙语),从而降低像“午餐”到“午餐”一词。
  • 的最频繁的非字(在,在,一,为...)

最适合的还是一个线性问题,所以理论上适合于神经网络,但为什么不拿名单立即数字最适合。

0

机器学习算法,如人工神经网络似乎不是这里最好的解决方案。人工神经网络可以用于多类分类(即,“输入表示的是提供的预训练类中的哪一类?”而不仅仅是“输入是否表示X?”),这符合您的用例。问题在于他们是受监督的学习方法,因此您需要提供一组关键字和类(部分)对的列表,其中涵盖了您的用户将提供的每个可能的输入。这是不可能的,在实践中,如果有更多的数据可用来产生更好的结果并创建更准确的将输入映射到输出的功能的决策边界/表示,则人工神经网络将被重新训练。这也假定你在开始之前知道所有可能的类,并且每个类都有你提供的训练输入值。

问题是,您的ANN的输入(字符列表或字符串的数字散列)不提供用于分类的上下文。没有提供更高级的信息来描述单词的含义。这意味着,如果训练数据不足,则可能会错误地分类出一个散列到数值上接近的值的错误分类。

(如maclema说,从一个ANN的输出将总是与表示接近一个类中的每个值浮子 - 或一类具有不确定性的水平)

一个更好的解决办法是采用某种字关系或同义词图。 A Bag of words model可能在此处有用。

编辑:根据您的评论,您不知道节前的部分, 一个简单的解决方案将提供一个文件中的关键字列表,在人们使用该程序时得到更新。简单地存储已提供评论的映射 - >您将在数据库中拥有的部分将允许您筛选出非关键字(和,或,,...)。一种选择是随后找到所键入的关键字所属的每个部分的列表并建议多个部分并让用户选择一个部分。您从用户选择中获得的反馈可以改进未来的建议。另一种方法是计算一个Bayesian probability--给定以前存储的映射的这个词属于X节点的概率 - 对于所有关键字和节,并且采用模态节或者对每个唯一关键字进行标准化并采取平均值。当你收集更多的课程信息时,概率的计算需要更新,也许这可以在后台线程中每增加一个新的内容来完成。