如何从一系列文本输入中提取常用/重要短语


68

我有一系列文本项-来自MySQL数据库的原始HTML。我想在这些条目中找到最常用的短语(而不是单个最常用的短语,理想情况下,不强制单词对单词的匹配)。

我的示例是Yelp.com上的任何评论,其中以给定餐厅的数百条评论显示了3个摘要,格式为:

“尝试汉堡”(共44条评论)

例如,此页面的“评论重点”部分:

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

我已经安装了NLTK,并且已经对其进行了一些尝试,但是老实说,这些选择让他们不知所措。这似乎是一个相当普遍的问题,我无法通过在此处搜索找到简单的解决方案。


1
使用nltk,很容易获得二元组和三元组,但是我要寻找的是短语,其长度可能为7-8个字。我还没有弄清楚如何使nltk(或其他方法)提供此类“八边形图”。
arronsky'3

也许您可以尝试基于图的算法,例如TextRank-github.com/ceteri/pytextrank
Ricardo

Answers:


96

我怀疑您不只是想要最普通的短语,而是想要最有趣的搭配。否则,您可能最终会过度表达由普通单词组成的短语,而减少有趣和翔实的短语。

为此,您实际上将需要从数据中提取n元语法,然后找到具有最高点智慧互信息(PMI)的n元语法。就是说,您想找到共同出现的单词比您期望它们偶然出现的更多。

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
是的,我同意-并查看该页面,我可以得到二元和三元语法,但是这如何扩展到n元语法呢?我相信我需要长度大于5的短语才能真正有趣,也许我表达了自己的无知,但是此演示页面仅允许我获得2个和3个单词集?
Arronsky'3

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

5
这个。我认为你是绝对正确的。辉煌(优雅)的观察!
Arronsky'3


3

如果您只想大于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,因为我自己一个月才这样做,但可能会有帮助!


1
-1这对我没有任何帮助。我和OP处在同一情况下,而您的方法只返回了遵循原始文本结构的大量元组列表。我应该如何进行?
磁星

1
有了该列表后,您需要遍历该列表以计算唯一ngram的存在。实现此目的的一种方法是创建一个dict,其中的键为ngram,每次获得匹配项时将其递增
Toby

我也不明白 您如何计算独特的克数?这是一袋个别的单词。
以示例方式

0

好吧,一开始您可能必须删除所有HTML标记(搜索“ <[^>] *>”并将其替换为“”)。之后,您可以尝试在每两个文本项之间寻找最长的公共子字符串的幼稚方法,但是我认为您不会得到很好的结果。您可以先对单词进行规范化(将它们简化为基本形式,删除所有重音,将所有内容设置为小写或大写),然后再进行分析,从而做得更好。同样,根据您想完成的工作,如果您允许一定的词序灵活性,则可以更好地将文本项聚类,即将文本项视为归一化的词袋并衡量袋子内容的相似性。

我已经评论了一个类似(虽然不完全相同)的话题在这里

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.