3

通常のテキスト ファイルを使用して、キャリッジ リターン ("\n") で区切られた削除する単語を含む別のファイル (ストップワード) で識別される単語を削除しようとしています。

現在、両方のファイルをリストに変換して、各リストの要素を比較できるようにしています。この関数を動作させましたが、ストップワード ファイルで指定したすべての単語が削除されません。どんな助けでも大歓迎です。

def elimstops(file_str): #takes as input a string for the stopwords file location
  stop_f = open(file_str, 'r')
  stopw = stop_f.read()
  stopw = stopw.split('\n')
  text_file = open('sample.txt') #Opens the file whose stop words will be eliminated
  prime = text_file.read()
  prime = prime.split(' ') #Splits the string into a list separated by a space
  tot_str = "" #total string
  i = 0
  while i < (len(stopw)):
    if stopw[i] in prime:
      prime.remove(stopw[i]) #removes the stopword from the text
    else:
      pass
    i += 1
  # Creates a new string from the compilation of list elements 
  # with the stop words removed
  for v in prime:
    tot_str = tot_str + str(v) + " " 
  return tot_str
4

3 に答える 3

3

ジェネレーター式を使用した代替ソリューションを次に示します。

tot_str = ' '.join(word for word in prime if word not in stopw)

これをより効率的にするstopwには、setusingに変換しstopw = set(stopw)ます。

sample.txt が単なるスペース区切りのファイルではない場合、現在のアプローチに問題がある可能性があります。たとえば、句読点のある通常の文がある場合、スペースで分割すると句読点が単語の一部として残ります。これを修正するには、reモジュールを使用して文字列を空白または句読点で分割します。

import re
prime = re.split(r'\W+', text_file.read())
于 2012-10-22T16:49:14.867 に答える
0

私はあなたの問題はこの行だと思います:

    if stopw[i] in prime:
      prime.remove(stopw[i]) #removes the stopword from the text

stopw[i]fromの最初の出現のみを削除しprimeます。これを修正するには、次のようにする必要があります。

    while stopw[i] in prime:
      prime.remove(stopw[i]) #removes the stopword from the text

in primeただし、とprime.removeビットの両方がプライムを反復処理する必要があるため、これは非常にゆっくりと実行されます。これは、文字列の長さが2次の実行時間になることを意味します。FJが提案するようなジェネレーターを使用する場合、実行時間は線形になり、はるかに優れています。

于 2012-10-22T16:58:40.600 に答える
0

私はpythonを知りませんが、O(n)+ O(m)時間-線形である一般的な方法を次に示します。

1: ストップワード ファイルのすべての単語をマップに追加します。
2: 通常のテキスト ファイルを読み、単語をリストに追加してみてください。#2 現在読み取られている単語がマップ内にあるかどうかを確認し、そうでない場合はスキップし、そうでない場合はリストに追加します。

最後に、リストには必要なすべての単語 (削除したかった単語) が含まれているはずです。

于 2012-10-22T16:57:07.833 に答える