如何从一系列文本条目中提取常见/重要短语
我有一系列文本项目 - 来自MySQL数据库的原始HTML。我想在这些条目中找到最常用的短语(不是最常见的短语,理想情况下,不强制逐字匹配)。如何从一系列文本条目中提取常见/重要短语
我的例子是Yelp.com任何审查,这表明从几百指定餐厅的评论的3段,格式为:
“尝试汉堡包”(44条)
如,该页面的“审查要点”部分:
http://www.yelp.com/biz/sushi-gen-los-angeles/
我有NLTK安装,我已经与它玩耍了一点,但我老老实实的选项淹没。这似乎是一个相当普遍的问题,我一直无法通过在这里搜索找到一个简单的解决方案。
那么,首先,您可能需要删除所有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)
是的,我同意 - 并且看着那个页面,我可以得到双和三克,但是这怎么扩展到n-gram呢?我相信我会需要长度大于5的短语真正有趣,也许我会表达我的无知,但是这个演示页面只能让我得到2到3个单词集? – arronsky 2010-03-16 09:40:20
为此,我认为您需要扩展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
这个。我认为你是绝对正确的。辉煌(和优雅)的观察! – 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的,因为我只是一直在这样做了一个月左右自己,但可能会有所帮助!
我认为你要找的是chunking。我建议阅读chapter 7 of the NLTK book或者我自己的文章chunk extraction。这两种方法都假定有关词性标注的知识,这在chapter 5中已涵盖。
与nltk,它很容易得到bigrams和trigrams,但我正在寻找的是更可能的长度为7 - 8个字的短语。我还没有想出如何使nltk(或其他方法)提供这样的“八度”和以上。 – arronsky 2010-03-16 09:23:39