2017-09-29 16 views
3

Zipfの法則をテストするために、アルファベット以外の文字でテキストファイル内のすべての単語を削除するPythonスクリプトを書く必要があります。たとえば :アルファベット以外の文字を含むすべての単語を削除する方法

[email protected] said: I've taken 2 reports to the boss 

どのように進めるべき

taken reports to the boss 

か?

+1

は、正規表現のための仕事のように見えます。 –

答えて

3

文字のみにマッチする正規表現を使用して(とアンダースコア)、あなたがこれを行うことができます:

import re 

s = "[email protected] said: I've taken 2 reports to the boss" 
# s = open('text.txt').read() 

tokens = s.strip().split() 
clean_tokens = [t for t in tokens if re.match(r'[^\W\d]*$', t)] 
# ['taken', 'reports', 'to', 'the', 'boss'] 
clean_s = ' '.join(clean_tokens) 
# 'taken reports to the boss' 
0

これは

array = string.split(' ') 
result = [] 
for word in array 
if word.isalpha() 
    result.append(word) 
string = ' '.join(result) 
2

はこれを試してみてくださいに役立つことがあります。

sentence = "[email protected] said: I've taken 2 reports to the boss" 
words = [word for word in sentence.split() if word.isalpha()] 
# ['taken', 'reports', 'to', 'the', 'boss'] 

result = ' '.join(words) 
# taken reports to the boss 
0

あなたは正規表現を使用することも、isalpha()などのビルド関数でPythonを使用することもできます

はisalphaを用いて、実施例()

result = '' 
with open('file path') as f: 
line = f.readline() 
a = line.split() 
for i in a: 
    if i.isalpha(): 
     print(i+' ',end='') 
0

str.join() +読解はあなたに1つのラインのソリューション提供します:

sentence = "[email protected] said: I've taken 2 reports to the boss" 
' '.join([i for i in sentence.split() if i.isalpha()]) 
#'taken reports to the boss' 
2

をあなたはsplit()を使用することができますし、唯一の単語のリストを取得するにはisalpha()ですアルファベット文字を含み、少なくとも1つの文字がある。

>>> alpha_only_string = " ".join(alpha_words) 
>>> print(alpha_only_string) 
taken reports to the boss 
1

nltkパッケージは、テキストを扱うに特化されていて、言葉に「トークン化」のテキストに使用できるさまざまな機能を持っています

>>> sentence = "[email protected] said: I've taken 2 reports to the boss" 
>>> alpha_words = [word for word in sentence.split() if word.isalpha()] 
>>> print(alpha_words) 
['taken', 'reports', 'to', 'the', 'boss'] 

あなたはその後、1つの文字列にリストを作成するjoin()を使用することができます。

RegexpTokenizerまたはword_tokenizeを少し修正して使用することができます。

最も簡単で最も簡単なものはありRegexpTokenizer:返し

import nltk 

text = "[email protected] said: I've taken 2 reports to the boss. I didn't do the other things." 

result = nltk.RegexpTokenizer(r'\w+').tokenize(text) 

`['asdf', 'gmail', 'com', 'said', 'I', 've', 'taken', '2', 'reports', 'to', 'the', 'boss', 'I', 'didn', 't', 'do', 'the', 'other', 'things']` 

それともdidn'tdidn'tのような最も収縮を分割することが可能であるword_tokenize少し賢く使用することができます。

返し
import re 
import nltk 
nltk.download('punkt') # You only have to do this once 

def contains_letters(phrase): 
    return bool(re.search('[a-zA-Z]', phrase)) 

text = "[email protected] said: I've taken 2 reports to the boss. I didn't do the other things." 

result = [word for word in nltk.word_tokenize(text) if contains_letters(word)] 

['asdf', 'gmail.com', 'said', 'I', "'ve", 'taken', 'reports', 'to', 'the', 'boss', 'I', 'did', "n't", 'do', 'the', 'other', 'things'] 
関連する問題