基于字典的ngram

时间:2018-11-20 08:22:59

标签: python regex

我正在尝试提取由一些较小部分组成的unigram,bi-和trigram字符串。如果它们是较大的一部分,是否有可能单独提取它们而不计算较小的呢?

text = "the log user should able to identify log entries  and domain  log entries"
ngramList = ['log', 'log entries','domain log entries']


import re

counts = {}
for ngram in ngrams:
  words = ngram.rsplit()
  pattern = re.compile(r'%s' % "\s+".join(words),re.IGNORECASE)
  counts[ngram] = len(pattern.findall(text))

print(counts)

当前程序输出= 'log':3 ,'log entries':2,'domain log entries':1

预期输出= 'log' : 1 , 'log entries':1, 'domain log entries':1

1 个答案:

答案 0 :(得分:3)

您可以先按大小对ngram列表进行排序,然后使用re.subn用空字符串替换每个ngram(从大到小),并同时计算替换次数。

由于从大到小的ngram进行排序,因此请确保不会将较小的ngram计为“较大的ngram”的一部分,因为您已将它们从循环中的字符串中删除了。

import re

s = "the log user should able to identify log entries  and domain  log entries"
ngramList = ['log', 'log entries','domain log entries']
ngramList.sort(key=len, reverse=True)

counts = {}

for ngram in ngramList:
    words = ngram.rsplit()
    pattern = re.compile(r'%s' % "\s+".join(words), re.IGNORECASE)
    s, n = re.subn(pattern, '', s)
    counts[ngram] = n

print(counts)

正如Wiktor在评论中指出的那样,您可能希望改善正则表达式模式。现在,模式也将与单词“ key logging”中的“ log”匹配。可以肯定的是,您希望将令牌包装在分词符中:

pattern = re.compile(r"\b(?:{})\b".format(r"\s+".join(ngram.split())), re.IGNORECASE)