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

Posted

技术标签:

【中文标题】如何从一系列文本条目中提取常用/重要短语【英文标题】:How to extract common / significant phrases from a series of text entries 【发布时间】:2011-01-28 00:30:16 【问题描述】:

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

我的示例是 Yelp.com 上的任何评论,它显示来自给定餐厅的数百条评论中的 3 个 sn-ps,格式为:

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

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

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

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

【问题讨论】:

使用 nltk,很容易获得二元组和三元组,但我正在寻找的是长度更可能为 7 到 8 个单词的短语。我还没有弄清楚如何让 nltk(或其他方法)提供这样的“八进制”及以上。 也许您可以尝试基于图形的算法,例如 TextRank - github.com/ceteri/pytextrank 【参考方案1】:

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

我评论了一个类似(虽然不相同)的主题here。

【讨论】:

【参考方案2】:

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

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

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)

【讨论】:

是的,我同意——看看那个页面,我可以得到尽可能多的双元和三元组,但这如何扩展到 n 元组?我相信我需要长度大于 5 的短语才能真正有趣,也许我在表达我的无知,但这个演示页面只让我得到 2 和 3 个单词集? 为此,我认为您需要扩展 nltk.collocations.AbstractCollocationFinder,使用 BigramCollocationFinder 和 TrigramCollocationFinder 作为指南,请参阅 nltk.googlecode.com/svn/trunk/doc/api/… 。但是,你确定你真的需要这么长的短语吗?在 Yelp 上,看起来他们正在突出显示单个单词和其中包含几个单词的搭配,在您的链接示例中,它们有生鱼片、小东京和鱼。然后他们选择一个完整的句子,其中包含每个有趣的单词或短语。 这个。我认为你是绝对正确的。出色(优雅)的观察!【参考方案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 这对我没有任何作用。我的情况与 OP 相同,您的方法只是返回了一个巨大的元组列表,这些元组遵循原始文本的结构。我应该怎么做? 获得该列表后,您需要遍历它以计算唯一 ngram 的存在。一种方法是创建一个字典,其中键是 ngram,并在每次匹配时递增它 我也不明白。你如何计算独特的克数?这是一袋单独的单词。【参考方案4】:

我认为您正在寻找的是分块。我推荐阅读chapter 7 of the NLTK book 或者我自己在chunk extraction 上的文章。这两个都假设知道词性标记,这在chapter 5中有所介绍。

【讨论】:

我真的不明白分块与它有什么关系。 Chunking 可以解析短语,一旦你有了短语,你就可以识别常见和重要的短语。

以上是关于如何从一系列文本条目中提取常用/重要短语的主要内容,如果未能解决你的问题,请参考以下文章

自然语言处理--TF-IDF(关键词提取)

用Py做文本分析5:关键词提取

如何使用神经网络从有关特定主题的句子中提取相关短语?

文本分类,如何将文本字符串转换为向量表示

关于机器学习中文本处理的一些常用方法

在两段文本之间寻找匹配的短语?