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

问题描述 投票:60回答:4

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

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

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

例如,本页的“评论要点”部分:

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

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

nlp text-extraction nltk text-analysis
4个回答
86
投票

我怀疑你不只是想要最常用的短语,而是你想要最有趣的搭配。否则,你最终可能会因为常用词汇和较少有趣且信息量较少的短语而过多地表达短语。

为此,您基本上希望从数据中提取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)

4
投票

我想你要找的是分块。我推荐在chapter 7 of the NLTK book上阅读chunk extraction或者我自己的文章。这两个都假设了词性标注的知识,这在chapter 5中有所涉及。


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,因为我自己一个月左右这么做,但可能会有所帮助!


0
投票

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

我评论了类似(虽然不完全相同)的主题here

© www.soinside.com 2019 - 2024. All rights reserved.