Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.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
Nlp 如何从一系列文本条目中提取常用/重要短语_Nlp_Text Extraction_Nltk_Text Analysis - Fatal编程技术网

Nlp 如何从一系列文本条目中提取常用/重要短语

Nlp 如何从一系列文本条目中提取常用/重要短语,nlp,text-extraction,nltk,text-analysis,Nlp,Text Extraction,Nltk,Text Analysis,我有一系列的文本项——来自MySQL数据库的原始HTML。我想在这些条目中找到最常见的短语(不是单个最常见的短语,理想情况下,不要强制进行逐字匹配) 我的例子是Yelp.com上的任何评论,其中显示了给定餐厅数百条评论的3个片段,格式如下: “尝尝汉堡”(44篇评论) e、 例如,本页的“回顾要点”部分: 我已经安装了NLTK,我已经尝试过了一点,但是我真的被这些选项弄得不知所措。这似乎是一个相当常见的问题,我无法通过在此处搜索找到一个简单的解决方案。首先,您可能需要删除所有HTML标记(搜索

我有一系列的文本项——来自MySQL数据库的原始HTML。我想在这些条目中找到最常见的短语(不是单个最常见的短语,理想情况下,不要强制进行逐字匹配)

我的例子是Yelp.com上的任何评论,其中显示了给定餐厅数百条评论的3个片段,格式如下:

“尝尝汉堡”(44篇评论)

e、 例如,本页的“回顾要点”部分:


我已经安装了NLTK,我已经尝试过了一点,但是我真的被这些选项弄得不知所措。这似乎是一个相当常见的问题,我无法通过在此处搜索找到一个简单的解决方案。

首先,您可能需要删除所有HTML标记(搜索“]*>”并将其替换为“”)。之后,您可以尝试在每两个文本项之间寻找最长的公共子字符串的简单方法,但我认为您不会得到很好的结果。 你可以先对单词进行规范化(将它们简化为基本形式,删除所有重音,将所有内容设置为小写或大写),然后进行分析。同样,根据您想要完成的任务,如果您允许一定的词序灵活性,也就是说,将文本项视为一袋袋规范化的单词,并测量袋内容的相似性,那么您可能能够更好地对文本项进行聚类


我对一个类似(虽然不完全相同)的话题发表了评论。

我想你不只是想要最普通的短语,而是想要最有趣的搭配。否则,你最终可能会出现由普通单词组成的短语过度呈现,而有趣和信息丰富的短语较少

要做到这一点,您基本上需要从数据中提取n-gram,然后找到具有最高(PMI)的数据。也就是说,你想要找到那些同时出现在一起的单词,而不是你所期望的偶然出现的单词

本章介绍了如何在大约7行代码中实现这一点,例如:

导入nltk
从nltk.consolutions导入*
bigram_measures=nltk.collaments.BigramAssocMeasures()
trigram_measures=nltk.consolutions.TrigramAssocMeasures()
#将此更改为读入数据
finder=bigramconsolutionfinder.from_words(
nltk.corpus.genesis.words('english-web.txt'))
#仅出现3次以上的大字符
查找器。应用频率滤波器(3)
#返回PMI最高的10 n克
finder.nbest(bigram_measures.pmi,10)

如果您只想获得大于3个的ngrams,您可以试试这个。我想你已经去掉了所有的垃圾,比如html等等

import nltk
ngramlist=[]
raw=<yourtextfile here>

x=1
ngramlimit=6
tokens=nltk.word_tokenize(raw)

while x <= ngramlimit:
  ngramlist.extend(nltk.ngrams(tokens, x))
  x+=1
导入nltk
ngramlist=[]
生的=
x=1
ngramlimit=6
tokens=nltk.word\u标记化(原始)

而x我认为你要找的是分块。我建议你读一读或者是我自己的文章。这两种方法都假设了词性标记的知识,这在中有介绍。

使用nltk,很容易获得bigram和trigram,但我要寻找的是长度更可能为7-8个单词的短语。我还没有弄明白如何让nltk(或其他一些方法)提供这样的“八进制”或更高。也许你可以尝试基于图形的算法,比如TextRank——是的,我同意——看看那个页面,我可以得到bi和tri-gram,但这是如何扩展到n-gram的?我相信我需要长度大于5的短语才能真正有趣,也许我是在表达我的无知,但这个演示页面只允许我获得2个和3个单词集?为此,我认为您需要使用BigramCollabonFinder和TrigramCollabonFinder作为指导,扩展nltk.CollaboractCollabonFinder.AbstractCollabonFinder,请参阅。但是,你确定你真的需要这么长的短语吗?在Yelp上,看起来它们突出显示了单个单词和搭配,其中包含了几个单词,在您的链接示例中,它们有生鱼片、小东京和鱼。然后,他们选择一个完整的句子,包含每个有趣的单词或短语。我认为你完全正确。卓越(优雅)的观察力-这对我来说毫无用处。我的情况与OP相同,您的方法只是返回了一个巨大的元组列表,它遵循原始文本的结构。我应该如何继续?一旦你有了这个列表,你需要循环遍历它来计算唯一NGRAM的存在。一种方法是创建一个dict,其中键是ngram,每次匹配时递增,我也不明白。你怎么计算唯一的克数?这是一袋单独的单词。我真的不明白分块与它有什么关系。分块可以解析短语,一旦你有了短语,你就可以识别常见的和重要的短语。