我有一个代码,我从大型语料库中提取bigrams,并连接/合并它们以获得unigrams。 '可能','是' - >也许。当然,语料库包含很多标点符号,但我也发现它包含其他字符,例如表情符号...我的计划是将标点符号放在列表中,如果这些字符不在一行中,则打印该行。也许我应该改变我的方法,只打印只包含字母而没有其他字符的行,因为我不知道语料库中有哪些字符。如何才能做到这一点?我确实需要在代码的第一部分保留这些其他字符,以便打印实际不存在的双字母组。我的代码的最后一行是目前:
counted = collections.Counter(grams)
for gram, count in sorted(counted.items()):
s = ''
print (s.join(gram))
我得到的输出是:
!aku
!bet
!brå
!båda
这些线对我来说没有任何用处...非常感谢一些帮助! :)
答案 0 :(得分:3)
如果您想检查每个字符串是否只包含字母,您可以使用isalpha()
method。
>>> '!båda'.isalpha()
False
>>> 'båda'.isalpha()
True
从示例中可以看出,此方法应识别任何unicode字母,而不仅仅是ascii。
答案 1 :(得分: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.
答案 2 :(得分:0)
您可以使用unicodedata module对字符进行分类:
import unicodedata
unigram= ''.join(gram)
if all(unicodedata.category(char)=='Ll' for char in unigram):
print(unigram)
答案 3 :(得分: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()]
在这种情况下,您只会检查字符。希望这澄清第二个问题。