【问题标题】:Creating single and double character n-grams from text files [duplicate]从文本文件创建单字符和双字符 n-gram [重复]
【发布时间】:2019-04-18 07:03:01
【问题描述】:

我希望我的代码能够将文本文件拆分为单字符和双字符 n-gram。例如,如果出现“dogs”这个词,我会想要“do”、“og”和“gs”。问题是我似乎只能将文本拆分成整个单词。

我尝试只使用一个简单的 split(),但这似乎不适用于重叠的 n-gram。

from collections import Counter 
from nltk.util import ngrams

def ngram_dist(fname, n):
    with open(fname, 'r') as fp:
        for lines in fp:
            for words in lines:
                    result = Counter(ngrams(fname.split(),n))
    return result

【问题讨论】:

  • 您想将每个单词拆分成一个 n-gram 吗?还是每个句子?还是每个文件?通常,n-gram 拆分一个单词,它们拆分一个句子。
  • 这应该可以工作:b="dogs"; print([b[i:i+2] for i in range(len(b)-1)])
  • @lll 不,这绝对不是骗人的,它只要求 words 的字符 n-gram,这个想要处理 a 中的所有行文件。请不要仅仅依赖问题的标题,它们通常需要更正。
  • 请不要发布duplicate questions,这是不允许的。您能否将其中一个请求合并到另一个请求中(粘贴您的代码和详细信息),然后关闭不需要的一个?

标签: python


【解决方案1】:

这里有一个解决方案。它将空格视为字符,但您可以根据需要将其删除。

import re

def generate_ngrams(s, n):
    # Convert to lowercases
    s = s.lower()

    # Replace all none alphanumeric characters with spaces
    s = re.sub(r'[^a-zA-Z0-9\s]', ' ', s)

    # Break sentence in the token, remove empty tokens
    tokens = [token for token in s if token != ""]

    # Use the zip function to help us generate n-grams
    # Concatentate the tokens into ngrams and return
    ngrams = zip(*[tokens[i:] for i in range(n)])
    return ["".join(ngram) for ngram in ngrams]
print(generate_ngrams("My Dogs is sick", 2))

【讨论】:

    猜你喜欢
    • 2016-05-02
    • 2013-10-13
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    • 2012-05-26
    • 2019-09-29
    • 2013-09-10
    • 2016-04-07
    相关资源
    最近更新 更多