0

テキストファイルからユニグラムを生成しようとしています。ただし、指定されたファイルの最初の行のバイグラムのみが表示されます。ファイル内のすべての文のユニグラムを表示したいと思います。

import string;
import sys;
import tokenize;

f = open("data.txt", 'r');
line=f.readline();
while line:
    line = line.rstrip();
    list = line.split();
    for word in list:
         print word
    line = f.readline();

なぜ文のユニグラムが表示されないのですか?また、これをバイグラムに変換するにはどうすればよいですか?

前もって感謝します。

data.txtは、文を含むテキストファイルです。2つの文があります-

        Hello world this is a test code
        today is 29th november 2011

出力を取得しています:

    Hello
    world
    this
    is
    a
    test

コード

4

2 に答える 2

3

そのコードスニペットには明らかな問題がいくつかあります。

  1. ;必要ありません
  2. インポートされたモジュール(つまりtokenize)は使用されません。これは有効ですが、無意味です。
  3. ファイル行のループはwhileを使用します。これは機能しますが、奇妙です。

テキストファイルの構造は表示されていませんが、各文が別々の行にあると想定しています(つまり、2つの文を持つテキストファイルには2つの行が含まれます)。

この場合のバイグラムが正確にわからないため、関数を置き換える必要があるかもしれませんbigram

from itertools import tee, izip

def bigrams(iterable):
    a, b = tee(iterable)
    next(b, None)
    return izip(a, b)

with open("data.txt", 'r') as f:
    for line in f:
        words = line.strip().split()
        uni = words
        bi = bigrams(words)
        print uni
        print list(bi)
于 2011-11-29T15:22:16.113 に答える
3

まず、Pythonの最新バージョンを使用している場合は、簡単に実行できます。for line in fこれは、このバージョンよりもはるかに簡単readlineです。;また、すべての行で使用する必要はありません。1行に複数のステートメントを作成する場合にのみ使用されます。

次の行は私にとっては問題なく機能します。

f = open("data.txt", 'r')
for line in f:
    for word in line.split():
        print word

線のバイグラムをこのようなものにするには、十分です(テストされていません!)

items = line.split()
bigrams = []
for i in xrange(len(items) - 1):
    bigrams.append((items[i], items[i + 1]))
于 2011-11-29T15:10:50.087 に答える