我需要为包含以下文本的文本文件计算Unigrams,BiGrams和Trigrams:
"囊性纤维化仅影响美国3万名儿童和青少年.吸入盐水雾可减少充满囊性纤维化患者呼吸道的脓液和感染,但副作用包括令人讨厌的咳嗽和严酷的味道.这就是结论在本周出版的"新英格兰医学杂志"上发表的两项研究."
我从Python开始并使用以下代码:
#!/usr/bin/env python
# File: n-gram.py
def N_Gram(N,text):
NList = [] # start with an empty list
if N> 1:
space = " " * (N-1) # add N - 1 spaces
text = space + text + space # add both in front and back
# append the slices [i:i+N] to NList
for i in range( len(text) - (N - 1) ):
NList.append(text[i:i+N])
return NList # return the list
# test code
for i in range(5):
print …Run Code Online (Sandbox Code Playgroud) 我正在使用NLTK在语料库中搜索n-gram,但在某些情况下需要很长时间.我注意到计算n-gram在其他包中并不常见(显然Haystack有一些功能).这是否意味着如果我放弃NLTK,我的语料库中有更快的方法可以找到n-gram?如果是这样,我可以用什么来加快速度?
输入文本总是菜名列表,其中有1~3个形容词和一个名词
输入
thai iced tea
spicy fried chicken
sweet chili pork
thai chicken curry
Run Code Online (Sandbox Code Playgroud)
输出:
thai tea, iced tea
spicy chicken, fried chicken
sweet pork, chili pork
thai chicken, chicken curry, thai curry
Run Code Online (Sandbox Code Playgroud)
基本上,我希望解析句子树并尝试通过将形容词与名词配对来生成二元词.
我想用spacy或nltk实现这一目标
TfidfVectorizer是否使用python 正则表达式识别n-gram ?
在阅读scikit-learn TfidfVectorizer的文档时出现了这个问题,我看到在单词级别识别n-gram的模式是token_pattern=u'(?u)\b\w\w+\b'.我很难看到它是如何工作的.考虑bi-gram案例.如果我做:
In [1]: import re
In [2]: re.findall(u'(?u)\b\w\w+\b',u'this is a sentence! this is another one.')
Out[2]: []
Run Code Online (Sandbox Code Playgroud)
我找不到任何双胞胎.鉴于:
In [2]: re.findall(u'(?u)\w+ \w*',u'this is a sentence! this is another one.')
Out[2]: [u'this is', u'a sentence', u'this is', u'another one']
Run Code Online (Sandbox Code Playgroud)
发现一些(但不是全部,例如u'is a',所有其他甚至计数的双字母都缺失).在解释\b字符函数时我做错了什么?
注意:根据正则表达式模块文档,re中的\b字符应该是:
\ b匹配空字符串,但仅匹配单词的开头或结尾.单词被定义为字母数字或下划线字符的序列,因此单词的结尾由空格或非字母数字的非下划线字符表示.
我看到问题解决识别蟒蛇正克的问题(见1,2),所以次要的问题是:我应该这样做,我的文字喂养TfidfVectorizer前添加加入正克?
以下word2ngrams函数从一个单词中提取字符3gram:
>>> x = 'foobar'
>>> n = 3
>>> [x[i:i+n] for i in range(len(x)-n+1)]
['foo', 'oob', 'oba', 'bar']
Run Code Online (Sandbox Code Playgroud)
这篇文章显示了单个单词的字符ngram提取,使用python快速实现字符n-gram。
但是,如果我有句子并且想提取字符ngram,该word2ngram()怎么办呢?
实现相同word2ngram和sent2ngram输出的正则表达式版本是什么?会更快吗?
我试过了:
import string, random, time
from itertools import chain
def word2ngrams(text, n=3):
""" Convert word into character ngrams. """
return [text[i:i+n] for i in range(len(text)-n+1)]
def sent2ngrams(text, n=3):
return list(chain(*[word2ngrams(i,n) for i in text.lower().split()]))
def sent2ngrams_simple(text, n=3):
text = text.lower()
return [text[i:i+n] for i in range(len(text)-n+1) if …Run Code Online (Sandbox Code Playgroud) 从 python 中的给定字符串生成英语单词的所有可能组合。
输入:godaddy 输出:go、god、daddy、add、daddy
有什么好的图书馆吗?