删除单引号,同时保留撇号Python,NLTK

时间:2014-03-12 12:01:16

标签: python python-2.7 nltk

我正在尝试创建一个诗歌语料库的频率列表。代码读取.txt文件并使用数据创建.csv。

我正在努力解决的问题是从文本中删除不相关的标点符号。我到目前为止的相关代码是:

import nltk

raw = open('file_name.txt', 'r').read()
output = open('output_filename.csv','w')
txt = raw.lower()

pattern = r'''(?x)([A_Z]\.)+|\w+(-\w+)*|\.\.\|[][.,;"'?():-_`]'''
tokenized = nltk.regexp_tokenize(txt,pattern)

这几乎完美,因为它保留了诸如烟囱清扫器之类的单词中的连字符,但它也将收缩切割成两个单独的单词,这不是我想要的。

例如,我的文本文件(试运行在William Blake的纯真之歌中)有以下几行:

  

'播放一首关于羔羊的歌!'

我想成为

  

管道a |歌曲|关于| a |兰姆

我之前使用的代码保持了收缩的完整性,但也给我留下了附加在单词上的单引号:

for punct in string.punctuation:
    txt = txt.replace(punct,' ')
re.sub(r'\r+',' ',txt)

所以我会得到

  

'管道| a |歌曲|关于| a |兰姆

我想找到这两者之间的中间立场,因为我需要用 O'er 和连字符这样的词来保留撇号,但要摆脱其他一切。

我知道这个话题似乎在这个论坛上已经筋疲力尽了,但是我花了四天时间尝试提供的所有例子并且无法让它们像宣传的那样工作,所以不要撕掉我所有的头发我以为我会尝试发一个问题。

编辑:

似乎标准标记器不使用我的文本的原因是一些撇号在奇数位置右/左倾斜的结果。我使用一堆.replace()指令生成了我想要的结果:

txt = txt.replace("\n", " ")
#formats the text so that the line break counts as a space
txt = txt.replace("”", " ")
#replaces stray quotation marks with a space
txt = txt.replace("“", " ")
#replaces stray quotation marks with a space
txt = txt.replace(" ’", " ")
#replaces a right leaning apostrophe with a space if it follows a space(which now includes line breaks)
txt = txt.replace(" ‘", " ")
#replaces a left leaning apostrophe with a space if it follows a space

我不怀疑有一种方法可以将所有这些整合到一行代码中,但我真的很高兴这一切都有效!

1 个答案:

答案 0 :(得分:9)

您可以在空格splitstrip而不是替换标点符号,然后在每个单词的开头和结尾处加上>>> import string >>> phrase = "'This has punctuation, and it's hard to remove!'" >>> [word.strip(string.punctuation) for word in phrase.split(" ")] ['This', 'has', 'punctuation', 'and', "it's", 'hard', 'to', 'remove'] 标点符号:

""

这会将撇号和连字符保留在单词中,同时删除单词开头或结尾的标点符号。


请注意,独立标点符号将替换为空字符串>>> phrase = "This is - no doubt - punctuated" >>> [word.strip(string.punctuation) for word in phrase.split(" ")] ['This', 'is', '', 'no', 'doubt', '', 'punctuated']

False

这很容易过滤掉,因为空字符串会评估filtered = [f for f in txt if f and f.lower() not in stopwords] # ^ excludes empty string

{{1}}