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

问题描述:

我有一系列文本项目 - 来自MySQL数据库的原始HTML。我想在这些条目中找到最常用的短语(不是最常见的短语,理想情况下,不强制逐字匹配)。如何从一系列文本条目中提取常见/重要短语

我的例子是Yelp.com任何审查,这表明从几百指定餐厅的评论的3段,格式为:

“尝试汉堡包”(44条)

如,该页面的“审查要点”部分:

http://www.yelp.com/biz/sushi-gen-los-angeles/

我有NLTK安装,我已经与它玩耍了一点,但我老老实实的选项淹没。这似乎是一个相当普遍的问题,我一直无法通过在这里搜索找到一个简单的解决方案。

+1

与nltk,它很容易得到bigrams和trigrams,但我正在寻找的是更可能的长度为7 - 8个字的短语。我还没有想出如何使nltk(或其他方法)提供这样的“八度”和以上。 – arronsky 2010-03-16 09:23:39

那么,首先,您可能需要删除所有HTML标签(搜索“< [^>] *>”并用“”替换)。之后,你可以尝试寻找每两个文本项之间最长的常见子串的简单方法,但我认为你不会得到很好的结果。 您可以通过将词汇归一化(将它们降至基本形式,删除所有重音符号,将所有内容设置为低位或大写)首先执行然后分析。再次,根据您想要完成的内容,如果您允许某些字词顺序灵活性,即将文本项目视为标准化单词的袋子并测量袋子内容相似性,则可以更好地将文本项目聚类。

我评论过类似(但不完全相同)的主题here

我怀疑你不只是想要最常见的词组,而是你想要最有趣的搭配。否则,最终可能会出现由常用单词组成的短语过多,而有趣且信息量较少的短语。

为此,您基本上需要从数据中提取n-gram,然后找到具有最高point wise mutual information(PMI)的n-gram。也就是说,你想要找到一起出现的单词比你期望的更多。

NLTK collocations how-to将介绍如何做到这一点的代码约7系,例如:

import nltk 
from nltk.collocations import * 
bigram_measures = nltk.collocations.BigramAssocMeasures() 
trigram_measures = nltk.collocations.TrigramAssocMeasures() 

# change this to read in your data 
finder = BigramCollocationFinder.from_words(
    nltk.corpus.genesis.words('english-web.txt')) 

# only bigrams that appear 3+ times 
finder.apply_freq_filter(3) 

# return the 10 n-grams with the highest PMI 
finder.nbest(bigram_measures.pmi, 10) 
+1

是的,我同意 - 并且看着那个页面,我可以得到双和三克,但是这怎么扩展到n-gram呢?我相信我会需要长度大于5的短语真正有趣,也许我会表达我的无知,但是这个演示页面只能让我得到2到3个单词集? – arronsky 2010-03-16 09:40:20

+3

为此,我认为您需要扩展nltk.collocations.AbstractCollocationFinder,使用BigramCollocationFinder和TrigramColocationFinder作为指南,请参阅http://nltk.googlecode.com/svn/trunk/doc/api/nltk.collocations-pysrc .html。但是,你确定你真的需要这么长的短语吗?在Yelp上,看起来他们突出显示单词和搭配以及几个单词,在你的生鱼片,小东京和鱼的链接例子中。然后他们选择一个包含每个有趣单词或短语的完整句子。 – dmcer 2010-03-16 18:57:12

+3

这个。我认为你是绝对正确的。辉煌(和优雅)的观察! – arronsky 2010-03-17 10:13:33

,如果你只是想获得大于3级的n-gram你可以试试这个。我假设你已经去掉了所有的垃圾,如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 

可能不是很Python的,因为我只是一直在这样做了一个月左右自己,但可能会有所帮助!

+1

-1这对我没有任何帮助。我与OP的情况相同,你的方法只是返回了原始文本结构之后的一大堆元组。我应该如何继续? – magnetar 2012-10-24 20:24:24

+0

一旦你有了这个列表,你需要遍历它来计算独特的ngram的存在。一种方法是通过创建一个字典,其中的关键是ngram,并在每次匹配时增加它。 – Toby 2012-10-31 09:49:23

+0

我也不明白这一点。你如何计算独特的克数?这是一个单独的词袋。 – 2016-05-24 03:11:37

我认为你要找的是chunking。我建议阅读chapter 7 of the NLTK book或者我自己的文章chunk extraction。这两种方法都假定有关词性标注的知识,这在chapter 5中已涵盖。

+0

我真的不明白什么样的块与它有关。 – magnetar 2012-10-24 20:25:05

+1

块可以解析短语,一旦你有短语,那么你可以识别常见和重要的短语。 – Jacob 2012-10-25 02:05:53