2016-07-10 4 views
1

リスト内のリストごとに特定の量の単語にテキストファイルを分割する必要があります。PythonでテキストをnGramsに分割する

は、テキストファイルは、私はこの

ngrams.makeNGrams("ngrams.txt", 3) 

#it should give out: 

[[’i’,’am’,’having’],[’having’,’a’,’good’],[’good’,’day’,’today’]] 

は誰もいのように機能が見えた場合は、この

ngrams.makeNGrams("ngrams.txt", 2) 
#so since the given variable says 2 the output should look like this: 

[['i', 'am'],['am', 'having'],['having', 'a'],['a',’good’],[’good’, ’day’],[’day’,’today’]] 

のように見える機能を記述する必要があり、この

"i am having a good day today" 

のように見えると言います今私はこのベストをどのように処理すべきですか?アドバンス

で おかげでたくさん
+1

スタックオーバーフローはコード作成サービスではなく、宿題のようです。あなたが試したことを私たちに見せてください:詳細については、[宿題についての質問](http://meta.stackexchange.com/questions/10811/how-do-i-ask-and-answer-homework-questions)を参照してください。 – TemporalWolf

答えて

0

は定義:

def ngrams(text, n): 
    words = text.split() 
    return [ words[i:i+n] for i in range(len(words)-n+1) ] 

と使用を:

s = "i am having a good day today" 
ngrams(s, 2) 
+1

素晴らしいありがとうございます – gbZDB

0

私はこれを行うためのより多くの神託の方法があることを確認しています。それは関数ではありませんが(適応するのは簡単ですが)、プログラムではありません。

import sys 

num = int(sys.argv[1]) 

cad = "i am having a good day today" 

listCad = cad.split(" ") 

listOfLists = [] 
i = 0 
while i <= len(listCad) - num: 
    listOfLists.append(listCad[i:i+num]) 
    i = i + (num - 1) 

print listOfLists 
1

が、私はこのようにそれを行うだろう:私はそれはあなたの仕様を次のだと思い

def ngrams(words, n): 
    return zip(*(words[i:] for i in range(n))) 

使用法:

>>> words = "i am having a good day today".split() 
>>> list(ngrams(words, 2)) 
[('i', 'am'), ('am', 'having'), ('having', 'a'), ('a', 'good'), ('good', 'day'), ('day', 'today')] 
>>> list(ngrams(words, 3)) 
[('i', 'am', 'having'), ('am', 'having', 'a'), ('having', 'a', 'good'), ('a', 'good', 'day'), ('good', 'day', 'today')] 

考え方はして、元のリストからnリストを生成することですi番目のリストはiによってシフトされました。そして、単純にzipこれらのリストをシフトして結果を返します。 n=3ため

可視化:リストの最短は、所望の出力を生成する、消耗するまで

['i',  'am',  'having', 'a', 'good', 'day', 'today'] # not shifted 
['am',  'having', 'a',  'good', 'day', 'today']   # shifted by 1 
['having', 'a',  'good', 'day', 'today']     # shifted by 2 

zip機能は一緒に同じインデックスの要素を縫います。

+0

私は得ています TypeError:タイプオブジェクトの後ろに*は、シーケンスでなければなりません、ジェネレータではありません – gbZDB

+0

あなたはPython3を使用していますか? 編集 - Python2.7とPython3.5の両方で試してみましたが、動作します - 結果をリストに変換して両方で同じように動作するように答えを編集しました。 – plamut

+0

はい、python 3.4 ファイルデータを使ってスキップし、文字列をオブジェクトのように使用しましたが、 gbZDB

関連する問題