Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用NLTK在文本中查找原因_Python_Python 2.7_Neural Network_Nltk_Textblob - Fatal编程技术网

Python 使用NLTK在文本中查找原因

Python 使用NLTK在文本中查找原因,python,python-2.7,neural-network,nltk,textblob,Python,Python 2.7,Neural Network,Nltk,Textblob,对于我的工作项目,我的任务是浏览大量用户生成的文本,其中一些文本是取消他们的互联网服务的原因,以及该原因发生的频率。可能是他们搬家了,只是不喜欢,或者服务不好,等等 虽然这不一定是Python的问题,但我想知道是否有某种方法可以以某种方式使用NLTK或Textblob来确定取消的原因。我高度怀疑是否有任何自动化的东西可以完成这样一项专门的任务,我意识到我可能需要建立一个神经网络,但任何关于如何解决这个问题的建议都将不胜感激 到目前为止,我一直在想: 1) 使用词干和标记,并总结最常用的单词。简单

对于我的工作项目,我的任务是浏览大量用户生成的文本,其中一些文本是取消他们的互联网服务的原因,以及该原因发生的频率。可能是他们搬家了,只是不喜欢,或者服务不好,等等

虽然这不一定是Python的问题,但我想知道是否有某种方法可以以某种方式使用NLTK或Textblob来确定取消的原因。我高度怀疑是否有任何自动化的东西可以完成这样一项专门的任务,我意识到我可能需要建立一个神经网络,但任何关于如何解决这个问题的建议都将不胜感激

到目前为止,我一直在想: 1) 使用词干和标记,并总结最常用的单词。简单的方法,不是那么准确。 2) n克。计算密集,但可能有一些希望。 3) 词性标注和组块,可能会找到跟在连词后面的词,比如“因为”。 4) 手动检查所有文本字段,并记下取消的原因。效率不高,破坏了找到某种算法的全部目的。 5) 我完全不知道,我也不知道这是否可行

如果你能给我一些建议,我将不胜感激

如果这个答案太笼统或者你不能理解,不要担心 这是学术性的东西,需要一些基本的准备。 如果您愿意,请随时与我联系(询问我的邮件 在comment或smth中,我们将找出一些问题)

我觉得这个问题更适合我

无论如何,您需要做的第一件事是创建一些训练集。您需要找到尽可能多的带有原因的文档,并对它们进行注释,标记指定原因的短语。文档越多越好。 如果您要使用用户报告,请使用示例报告,以便培训数据和真实数据来自同一来源。 这就是您将如何为您的处理构建某种语料库的方法

然后,您必须指定需要哪些功能。这可能是POS标签、n-gram特征、引理/茎等。这需要实验和一些实践。在这里,我将使用一些n-gram特性(可能是2-gram或3-gram)和一些基于Wordnet的知识

最后一步是构建chunker或annotator。这是一个组件,将采取你的训练集,分析它,并了解它应该标记什么。 您将遇到所谓的“语义鸿沟”——这个术语描述了当您的程序“学到”了您不想要的东西时的情况(这是一种简化)。例如,您可以使用这样一组功能,您的chunker将学习查找“我不”短语而不是理性短语。这实际上取决于您的培训集和功能集。 如果出现这种情况,您应该尝试更改功能集,并在一段时间后尝试使用培训集,因为它可能不具有代表性

如何构建这样的chunker?对于您的情况,我会使用HMM(隐马尔可夫模型)或更好的CRF(条件随机场)。这两种是流注释常用的统计方法,您的文本基本上是一个令牌流。另一种方法是使用任何“标准”分类器(从朴素贝叶斯,通过一些决策树,从神经网络到支持向量机),并在文本中的每个n-gram上使用它

当然,选择特征集在很大程度上取决于所选择的方法,所以请阅读一些关于它们的信息并明智地选择

注:这是一个过于简单的答案,遗漏了许多关于训练集准备、选择特征、预处理语料库、为语料库寻找来源等的重要内容。这不是走一遍——这些是你应该自己探索的基本步骤

PPS。不确定,但NLTK可能有一些CRF或HMM实现。如果没有,我可以推荐Markov和CRF。注意——后者功能强大,但可以从Java或python安装和使用

==编辑==

关于功能:

首先,我们能想象出什么样的特征

  • 引理/词干-你在语料库中找到每个单词的词干或引理,选择最重要的(通常是频率最高的,或者至少你会从那里开始),然后将每个单词/n-gram表示为二进制向量,说明词干/引理化后表示的单词或序列是否包含该特征引理/词干
  • n-grams-与上面的类似,但您选择的不是单个单词,而是长度为n的最重要序列。“n-gram”表示“长度n的序列”,因此,例如,“我坐在长凳上”的双格图(2-gram)将是:“我坐”、“坐在”、“在椅子上”、“在长凳上”。
    • skipgrams-与n-grams相似,但在原始句子中包含“间隙”。例如,“棕色狐狸跳过某物”(对不起,我现在记不起这个短语:P)的间距为3的Biskipgram将是:[“快速”,“超过”],[“棕色”,“某物”]。通常,间隙大小为m的n-skipgram是通过获取一个单词、跳过m、获取一个单词等方式获得的,除非您有n个单词
  • POS标签——我总是把它们误认为是“位置”标签,但这是“词性”的首字母缩写。当您需要查找具有共同语法结构的短语,而不是普通单词时,它非常有用
当然,你可以把它们结合起来——例如,使用引理的skipgrams,或者引理的POS标签,或者甚至是引理的POS标签的*-grams(选择你最喜欢的:p)

使用引理的POS标记有什么意义?这将描述词的基本形式的词性,所以它将把你的特征简化为“这是一个名词”而不是“这是复数女性名词”

请记住,选择功能是整个过程中最重要的部分之一(另一部分是数据准备,但这需要整个学期的课程,功能选择可以在3-4节课中完成,因此我尝试在这里介绍基础知识)。 你需要某种直觉来“寻找”大块的东西——比如前男友