我正在寻找一种将文本分成n-gram的方法.通常我会做类似的事情:
import nltk
from nltk import bigrams
string = "I really like python, it's pretty awesome."
string_bigrams = bigrams(string)
print string_bigrams
Run Code Online (Sandbox Code Playgroud)
我知道nltk只提供bigrams和trigrams,但有没有办法将我的文本分成4克,5克甚至100克?
谢谢!
k skipgram是ngram,它是所有ngrams和每个(ki)skipgram的超集,直到(ki)== 0(包括0跳过克).那么如何在python中有效地计算这些跳过头文件呢?
以下是我尝试的代码,但它没有按预期执行:
<pre>
input_list = ['all', 'this', 'happened', 'more', 'or', 'less']
def find_skipgrams(input_list, N,K):
bigram_list = []
nlist=[]
K=1
for k in range(K+1):
for i in range(len(input_list)-1):
if i+k+1<len(input_list):
nlist=[]
for j in range(N+1):
if i+k+j+1<len(input_list):
nlist.append(input_list[i+k+j+1])
bigram_list.append(nlist)
return bigram_list
</pre>
Run Code Online (Sandbox Code Playgroud)
上面的代码无法正确呈现,但print find_skipgrams(['all', 'this', 'happened', 'more', 'or', 'less'],2,1)提供以下输出
[['this','发生','更多'],['发生','更多','或',['更多','或','更少'],['或','更少'',['less'],['发生','更多','或'],['更多','或','更少',['或','更少'],['更少'], ['减']]
此处列出的代码也没有给出正确的输出:https: //github.com/heaven00/skipgram/blob/master/skipgram.py
print skipgram_ndarray("你叫什么名字")给出:['什么,是','是,你的','你的名字','名字','什么,你的','是,名字']
名字是一个unigram!
我需要在NLTK中编写一个程序,将一个语料库(大量的txt文件)分成unigrams,bigrams,trigrams,fourgrams和fivegrams.我已经编写了代码将我的文件输入到程序中.
输入是用英文写的300 .txt文件,我希望以Ngrams的形式输出,特别是频率计数.
我知道NLTK有Bigram和Trigram模块:http://www.nltk.org/_modules/nltk/model/ngram.html
但我不是那么先进,他们进入我的计划.
输入:txt文件不是单句
输出示例:
Bigram [('Hi', 'How'), ('How', 'are'), ('are', 'you'), ('you', '?'), ('?', 'i'), ('i', 'am'), ('am', 'fine'), ('fine', 'and'), ('and', 'you')]
Trigram: [('Hi', 'How', 'are'), ('How', 'are', 'you'), ('are', 'you', '?'), ('you', '?', 'i'), ('?', 'i', 'am'), ('i', 'am', 'fine'), ('am', 'fine', 'and'), ('fine', 'and', 'you')]
Run Code Online (Sandbox Code Playgroud)
我的代码到目前为止:
from nltk.corpus import PlaintextCorpusReader
corpus = 'C:/Users/jack3/My folder'
files = PlaintextCorpusReader(corpus, '.*')
ngrams=2
def generate(file, ngrams):
for gram in range(0, ngrams):
print((file[0:-4]+"_"+str(ngrams)+"_grams.txt").replace("/","_"))
for file in files.fileids(): …Run Code Online (Sandbox Code Playgroud) 哪个ngram实现在python中最快?
我试图描述nltk的vs scott的zip(http://locallyoptimal.com/blog/2013/01/20/elegant-n-gram-generation-in-python/):
from nltk.util import ngrams as nltkngram
import this, time
def zipngram(text,n=2):
return zip(*[text.split()[i:] for i in range(n)])
text = this.s
start = time.time()
nltkngram(text.split(), n=2)
print time.time() - start
start = time.time()
zipngram(text, n=2)
print time.time() - start
Run Code Online (Sandbox Code Playgroud)
[OUT]
0.000213146209717
6.50882720947e-05
Run Code Online (Sandbox Code Playgroud)
有没有更快的实现在python中生成ngrams?
例如,我们有以下文本:
“Spark 是一个用于编写快速分布式程序的框架。Spark 解决了与 Hadoop MapReduce 类似的问题,但采用了快速的内存方法和简洁的函数式 API。......”
我需要这个文本的所有可能的部分,一字一字,然后两两,三三到五到五。像这样:
: ['Spark', 'is', 'a', 'framework', 'for', 'writing, 'fast', 'distributed', 'programs', ...]
twos : ['Spark is', 'is a', 'a framework', 'framework for', 'for writing' ...]
三:['Spark is a', 'is a framework', 'a framework for', 'framework for writing', 'for write fast', ...]
. . .
五:['Spark 是一个框架','是一个写作框架','一个快速写作的框架','一个快速分布式写作的框架',...]
请注意,要处理的文本是大文本(约 100GB)。我需要这个过程的最佳解决方案。可能应该并行处理多线程。
我不需要一次完整的列表,它可以流式传输。