71

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

我的示例是 Yelp.com 上的任何评论,它显示了来自给定餐厅的数百条评论的 3 个片段,格式如下:

“试试汉堡包”(44 条评论)

例如,本页的“回顾重点”部分:

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

我已经安装了 NLTK 并且我已经玩过它了一点,但老实说,我对这些选项感到不知所措。这似乎是一个相当普遍的问题,我无法通过在这里搜索找到一个简单的解决方案。

4

4 回答 4

100

我怀疑您不仅想要最常用的短语,还想要最有趣的搭配。否则,您最终可能会得到由常用词组成的短语过多,而有趣和信息丰富的短语则较少。

为此,您基本上需要从数据中提取 n-gram,然后找到具有最高点互信息(PMI) 的那些。也就是说,您希望找到同时出现的单词比您偶然期望的要多得多。

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)
于 2010-03-16T09:35:52.420 回答
5

我认为您正在寻找的是chunking。我推荐阅读NLTK 书的第 7 章,或者我自己的关于块提取的文章。这两个都假设有词性标注的知识,这在第 5 章中有介绍。

于 2010-04-15T02:37:02.160 回答
4

如果您只想获得大于 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,因为我自己只做了一个月左右,但可能会有所帮助!

于 2010-03-28T21:12:33.690 回答
0

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

我在这里评论了一个类似(尽管不相同)的主题。

于 2010-03-16T09:21:44.273 回答