如何从一系列文本条目中提取常见/重要的短语
我有一系列文本项目 – 来自MYSQL数据库的原始HTML。 我想在这些条目中find最常用的词组(不是最常用的词组,也不是最好的单词之间的匹配)。
我的例子是在Yelp.com上的任何评论,显示从给定的餐厅数百评论3片段,格式为:
“尝试汉堡包”(共44条评论)
例如本页面的“评论重点”部分:
http://www.yelp.com/biz/sushi-gen-los-angeles/
我有NLTK安装,我已经玩了一下,但老实说,select压倒。 这似乎是一个相当普遍的问题,我一直没有find一个简单的解决scheme,在这里search。 在此先感谢您的帮助。
我怀疑你不只是想要最常用的词组,而是想要最有趣的搭配 。 否则,最终可能会出现由常用词语构成的短语过多的情况,而有趣的和有信息的短语则会减less。
要做到这一点,你将基本上想从你的数据中提取n-gram,然后find那些具有最高点智能互信息 (PMI)的。 也就是说,你想find比你所期望的更多的单词一起出现的单词。
NLTK搭配如何涵盖如何在大约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)
如果你只想得到大于3个星号,你可以试试这个。 我假设你已经剥离了像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
也许不是很pythonic,因为我只有一个月左右的时间做了这个,但是可能会有所帮助!
我认为你在找什么东西。 我build议阅读NLTK书的第7章或者我自己的关于块提取的文章。 这两者都假定了关于词性标注的知识,这在第5章中已经介绍过了。
那么,一开始你可能不得不删除所有的HTML标签(search“<[^>] *>”并用“”replace)。 之后,你可以尝试寻找每两个文本项之间最长的常见子串的简单方法,但是我不认为你会得到很好的结果。 你可以做更好的规范化单词(减less他们的基本forms,删除所有口音,设置所有更低或大写), 然后分析。 同样,根据您想要完成的内容,如果您允许某些字词顺序灵活性,也就是说将文本项目视为标准化单词的袋子并测量包内容相似性,您可能能够更好地将文本项目聚类。
我在这里评论过类似的(虽然不是相同的)话题。