Python:如何在文本中找到n-gram模式?

时间:2012-02-15 00:21:57

标签: python regex nltk

我有一个可以长任意的字符串

s = 'Choose from millions of possibilities on Shaadi.com. Create your profile, search&contact; your special one.RegisterFree\xa0\xa0\xa0unsubscribing reply to this mail\xa0\n and 09times and this is limited time offer! and this is For free so you are saving cash'

我有一个垃圾字的列表,可能就像

p_words = ['cash', 'for free', 'limited time offer']

我想知道输入文本中是否存在模式以及有多少次?

只有一个单词时变得简单

import re
p = re.compile(''.join[p_words])  # correct me if I am wrong here
m = p.match(s)  

但它可能是bi-gram, tri-gram or n-gram

我们如何处理这个问题?

3 个答案:

答案 0 :(得分:4)

p = re.compile('|'.join(re.escape(w) for w in p_words))
然后

p将匹配p_words中的任何字符串。

答案 1 :(得分:2)

如果文字和单词数量不是很大,您可以从example开始:

d = {w: s.count(w) for w in p_words if w in s}
# -> {'cash': 1, 'limited time offer': 1}

您可以将其效果与以下内容进行比较:

import re
from collections import Counter

p = re.compile('|'.join(map(re.escape, p_words)))
d = Counter(p.findall(s))
# -> Counter({'limited time offer': 2, 'cash': 2})

供参考,将其速度与fgrep进行比较。它应该快速匹配输入流中的多个字符串:

$ grep -F -o -f  patternlist.txt largetextfile.txt  | sort | uniq -c

输出

  2 cash
  2 limited time offer

答案 2 :(得分:1)

正则表达式使用'|'分隔器。在每种情况下用'\ W +'替换空格,它与非字母相匹配,我认为你很高兴。