我有一系列文本项 - 来自MySQL数据库的原始HTML。我想找到这些条目中最常见的短语(不是单个最常用的短语,理想情况下,不强制逐字逐句匹配)。
我的示例是Yelp.com上的任何评论,其中显示了来自特定餐厅的数百条评论的3个片段,格式为:
“尝试汉堡包”(在44条评论中)
,例如,本页的“评论要点”部分:
http://www.yelp.com/biz/sushi-gen-los-angeles/
我已经安装了NLTK并且我已经玩了一些,但老实说我被这些选项所震撼。这似乎是一个相当普遍的问题,我无法通过搜索找到一个简单的解决方案。
答案 0 :(得分:85)
我怀疑你不只是想要最常用的短语,而是想要最有趣的搭配。否则,你最终可能会因为常用词汇和较少有趣且信息量较少的短语而过多地表达短语。
为此,您基本上希望从数据中提取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 :(得分:4)
我认为你要找的是 chunking 。我建议在chapter 7 of the NLTK book上阅读chunk extraction或者我自己的文章。这两个都假定了词性标注的知识,这在chapter 5中有所涉及。
答案 2 :(得分:3)
如果你只想要大于3个ngram,你可以试试这个。我假设你已经删除了像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,因为我自己一个月左右这么做,但可能会有所帮助!
答案 3 :(得分:0)
好吧,首先你可能需要删除所有HTML标签(搜索“&lt; [^&gt;] *&gt;”并将其替换为“”)。在那之后,您可以尝试寻找每两个文本项之间最长的常见子串的天真方法,但我认为您不会得到非常好的结果。 您可以通过规范化单词(将它们缩小为基本形式,删除所有重音,将所有内容设置为小写或大写)以及然后分析来做得更好。同样,根据您想要完成的任务,如果您允许一些单词顺序灵活性,您可以更好地对文本项进行聚类,即将文本项视为标准化单词的包并测量包内容的相似性。
我评论了类似(虽然不完全相同)的主题here。