我正在对单词列表执行以下操作。我从古腾堡项目文本文件中读取行,用空格分割每一行,执行一般标点符号替换,然后在其自己的行上打印每个单词和标点符号标签,以便稍后进一步处理。我不确定如何用标签替换每个单引号或排除所有撇号。我当前的方法是使用编译的正则表达式:
apo = re.compile("[A-Za-z]'[A-Za-z]")
并执行以下操作:
if "'" in word and !apo.search(word):
word = word.replace("'","\n<singlequote>")
但这忽略了带有撇号的单词周围使用单引号的情况。它也没有向我表明单引号是否紧邻单词的开头或单词的结尾。
输入示例:
don't
'George
ma'am
end.'
didn't.'
'Won't
示例输出(处理并打印到文件后):
don't
<opensingle>
George
ma'am
end
<period>
<closesingle>
didn't
<period>
<closesingle>
<opensingle>
Won't
我确实有一个与此任务相关的进一步问题:因为区分<opensingle>
vs <closesingle>
看起来相当困难,执行像这样的替换会更明智吗
word = word.replace('.','\n<period>')
word = word.replace(',','\n<comma>')
after执行替换操作?
我建议在这里聪明地工作:使用nltk或另一个 NLP 工具包代替。
对单词进行标记像这样:
import nltk
sentence = """At eight o'clock on Thursday morning
Arthur didn't feel very good."""
tokens = nltk.word_tokenize(sentence)
您可能不喜欢像 don 这样的缩写是分开的。实际上,这是预期的行为。看第401期.
然而,TweetTokenizer 可以帮助解决这个问题:
from nltk.tokenize import tknzr = TweetTokenizer()
tknzr.tokenize("The code didn't work!")
如果涉及更多,RegexpTokenizer 可能会有所帮助:
from nltk.tokenize import RegexpTokenizer
s = "Good muffins cost $3.88\nin New York. Please don't buy me\njust one of them."
tokenizer = RegexpTokenizer('\w+|\$[\d\.]+|\S+')
tokenizer.tokenize(s)
那么正确注释标记化的单词应该会容易得多。
更多参考:
- http://www.nltk.org/api/nltk.tokenize.html
- http://www.nltk.org/_modules/nltk/tokenize/regexp.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)