找不到有效的 ngram 文档
Having trouble finding ngram documentation that works
我正在尝试使用 python 中的 ngram 函数,但无法正确实施我正在处理的问题
我试过插入 ngram 和 ngrams
import nltk
from nltk.util import ngrams
def n_grams(words, min=2, max=3):
s = []
for n in range(min, max):
for ngram in ngrams(words, n):
s.append(' '.join(str(i) for i in ngram))
return s
t = 'hippopotomonstrosesquippedaliophobia'
t_split = re.split(r'\W*', t)
print(n_grams(t_split))
我正在尝试 return 以下内容:
#{'tr', 'ho', 'hi', 'to', 'om', 'io', 'ob', 'mo', 'ed', 'ip', 'al', 'bi', 'pe',
#'da', 'po', 'ns', 'qu', 'st', 'ia', 'ot', 'se', 'op', 'ro', 'ui', 'li', 'pp',
#'es', 'sq', 'ph', 'on', 'os'}
but instead returning this:
#[' h', 'h i', 'i p', 'p p', 'p o', 'o p', 'p o', 'o t', 't o', 'o m', #'m o', 'o n', 'n s', 's t', 't r', 'r o', 'o s', 's e', 'e s', 's q', #'q u', 'u i', 'i p', 'p p', 'p e', 'e d', 'd a', 'a l', 'l i', 'i o', #'o p', 'p h', 'h o', 'o b', 'b i', 'i a', 'a ']
真的,这里唯一的问题是多余的正则表达式和连接语法。您在匹配零到无限个非单词字符 ([^a-zA-Z0-9_]) 的模式上调用 re.split(),但您实际上没有任何匹配该模式的字符串。没有什么可以拆分的,所以正则表达式返回整个单词不变(并在 Python 3.6+ 中抛出错误)。在几个 Python 解释器中对其进行测试,看起来它也可能在字符串的开头和结尾拆分,但这可能是您正在使用的版本或 join 语句(见下文)——我无法从这个片段中分辨出来。
如果我使用您编写的 n_grams
函数,但在连接中使用 no space 调用它而不是使用连接,并完全删除你的正则表达式,我认为它得到了你想要的(双字母组):
print(set(n_grams(t)))
即:
{'es', 'op', 'bi', 'hi', 'ot', 'ro', 'ph', 'al',
'ns', 'sq', 'ho', 'ed', 'ob', 'ip', 'to', 'io',
'on', 'da', 'pe', 'om', 'mo', 'ia', 'st', 'po',
'tr', 'qu', 'se', 'ui', 'pp', 'li', 'os'}
如果你选择from collections import Counter
,那么你还可以获得:
print(Counter(n_grams(t)))
生成计数字典,本质上:
Counter({'ip': 2, 'pp': 2, 'po': 2, 'op': 2, 'hi': 1, 'ot': 1, 'to': 1, 'om':
1, 'mo': 1, 'on': 1, 'ns': 1, 'st': 1, 'tr': 1, 'ro': 1, 'os': 1, 'se': 1,
'es': 1, 'sq': 1, 'qu': 1, 'ui': 1, 'pe': 1, 'ed': 1, 'da': 1, 'al': 1, 'li':
1, 'io': 1, 'ph': 1, 'ho': 1, 'ob': 1, 'bi': 1, 'ia': 1})
要处理边缘字符,你可以告诉NLTK的ngram函数使用左右填充,并指定字符(通常是"<s>"
和"</s>"
),但这似乎不是在此示例中是必需的。
我正在尝试使用 python 中的 ngram 函数,但无法正确实施我正在处理的问题
我试过插入 ngram 和 ngrams
import nltk
from nltk.util import ngrams
def n_grams(words, min=2, max=3):
s = []
for n in range(min, max):
for ngram in ngrams(words, n):
s.append(' '.join(str(i) for i in ngram))
return s
t = 'hippopotomonstrosesquippedaliophobia'
t_split = re.split(r'\W*', t)
print(n_grams(t_split))
我正在尝试 return 以下内容:
#{'tr', 'ho', 'hi', 'to', 'om', 'io', 'ob', 'mo', 'ed', 'ip', 'al', 'bi', 'pe',
#'da', 'po', 'ns', 'qu', 'st', 'ia', 'ot', 'se', 'op', 'ro', 'ui', 'li', 'pp',
#'es', 'sq', 'ph', 'on', 'os'}
but instead returning this:
#[' h', 'h i', 'i p', 'p p', 'p o', 'o p', 'p o', 'o t', 't o', 'o m', #'m o', 'o n', 'n s', 's t', 't r', 'r o', 'o s', 's e', 'e s', 's q', #'q u', 'u i', 'i p', 'p p', 'p e', 'e d', 'd a', 'a l', 'l i', 'i o', #'o p', 'p h', 'h o', 'o b', 'b i', 'i a', 'a ']
真的,这里唯一的问题是多余的正则表达式和连接语法。您在匹配零到无限个非单词字符 ([^a-zA-Z0-9_]) 的模式上调用 re.split(),但您实际上没有任何匹配该模式的字符串。没有什么可以拆分的,所以正则表达式返回整个单词不变(并在 Python 3.6+ 中抛出错误)。在几个 Python 解释器中对其进行测试,看起来它也可能在字符串的开头和结尾拆分,但这可能是您正在使用的版本或 join 语句(见下文)——我无法从这个片段中分辨出来。
如果我使用您编写的 n_grams
函数,但在连接中使用 no space 调用它而不是使用连接,并完全删除你的正则表达式,我认为它得到了你想要的(双字母组):
print(set(n_grams(t)))
即:
{'es', 'op', 'bi', 'hi', 'ot', 'ro', 'ph', 'al',
'ns', 'sq', 'ho', 'ed', 'ob', 'ip', 'to', 'io',
'on', 'da', 'pe', 'om', 'mo', 'ia', 'st', 'po',
'tr', 'qu', 'se', 'ui', 'pp', 'li', 'os'}
如果你选择from collections import Counter
,那么你还可以获得:
print(Counter(n_grams(t)))
生成计数字典,本质上:
Counter({'ip': 2, 'pp': 2, 'po': 2, 'op': 2, 'hi': 1, 'ot': 1, 'to': 1, 'om':
1, 'mo': 1, 'on': 1, 'ns': 1, 'st': 1, 'tr': 1, 'ro': 1, 'os': 1, 'se': 1,
'es': 1, 'sq': 1, 'qu': 1, 'ui': 1, 'pe': 1, 'ed': 1, 'da': 1, 'al': 1, 'li':
1, 'io': 1, 'ph': 1, 'ho': 1, 'ob': 1, 'bi': 1, 'ia': 1})
要处理边缘字符,你可以告诉NLTK的ngram函数使用左右填充,并指定字符(通常是"<s>"
和"</s>"
),但这似乎不是在此示例中是必需的。