2017-04-21 47 views
1

我有一個代碼,我從大型語料庫中提取bigrams,並將它們連接/合併爲unigrams。 'may','be' - >也許。當然,語料包含許多標點符號,但我也發現它包含其他字符,如表情符號......我的計劃是在標籤中加標點符號,如果這些字符不在一行中,則打印行。也許我應該改變我的方法,只打印只包含字母和其他字符的行,因爲我不知道語料庫中有哪些字符。如何才能做到這一點?我確實需要爲代碼的第一部分保留這些其他字符,以便打印出實際上不存在的bigrams。我的代碼的最後一行是在此刻:如何從輸出中刪除除字母之外的其他字符的行?

counted = collections.Counter(grams) 
    for gram, count in sorted(counted.items()): 
     s = '' 
     print (s.join(gram)) 

和輸出我得到的是:

!aku 
    !bet 
    !brå 
    !båda 

這些線路不會受到任何使用我的......真的很感激一些幫幫我! :)

回答

2

過濾掉包含非字母字符的字符串,代碼可以檢查非字母字符的每根弦的存在:

# coding=utf-8 

import string 
import unicodedata 

source_strings = [u'aku', u'bet', u'brå', u'båda', u'!båda'] 

valid_chars = (set(string.ascii_letters)) 

valid_strings = [s for s in source_strings if 
       set(unicodedata.normalize('NFKD', s).encode('ascii', 'ignore')) <= valid_chars] 
# valid_strings == [u'aku', u'bet', u'brå', u'båda'] 
# "båda" was not included. 
+0

謝謝!事情是瑞典文,所以我需要保持å,ä,ö。使它更復雜一點,或者我可以將整個字母寫成valid_chars? –

+2

如果設置了<= valid_chars',怎麼辦? –

+1

@PeterWood,yap,這是它應該寫的方式:)謝謝,編輯。 – Elisha

0

您可以使用unicodedata module的字符分類:

import unicodedata 

unigram= ''.join(gram) 
if all(unicodedata.category(char)=='Ll' for char in unigram): 
    print(unigram) 
3

如果你想檢查每個字符串只包含字母,你可以使用isalpha() method

>>> '!båda'.isalpha() 
False 
>>> 'båda'.isalpha() 
True 

從示例中可以看出,此方法應該識別任何unicode字母,而不僅僅是ascii。

+0

謝謝!我用這個如果是True:print。 –

0

如果你想從你的行只刪除一些字符,然後你可以用一個簡單的過濾器編輯之前更換您的線路是:

sourceList = ['!aku', '!bet', '!brå', '!båda'] 
newList = [] 
for word in sourceList: 
    for special in ['!','&','å']: 
     word = word.replace(special,'') 
    newList.append(word) 

然後,你可以做什麼是需要你的二元鍛鍊。希望這個幫助。

第二個查詢:如果你有很多的字符,然後在你的字符串,你可以隨時使用因而isalpha():

sourceList = ['!aku', '!bet', 'nor mal alpha', '!brå', '!båda'] 
newList = [word for word in sourceList if word.isalpha()] 

在這種情況下,您將只檢查字符。希望澄清第二個查詢。

+1

'newList = [wordList for wordList if word.isalpha()]' –

+0

或'newList = filter(str.isalpha,sourceList)' –

+0

我還沒有使用列表理解,但它是一個很好的例子查詢:-)祝你有美好的一天! –

相關問題