我如何使用NLTK和Python标记和块法文文本?
我在JSON文件中有30,000多种法语文章。 我想对单个文章和整个集合进行一些文本分析。 在我走得更远之前,我先从简单的目标开始:
我迄今采取的步骤:
将数据导入python列表中:
import json
json_articles=open('articlefile.json')
articlelist = json.load(json_articles)
选择一篇文章进行测试,并将正文文本连接成单个字符串:
txt = ' '.join(data[10000]['body'])
加载了一个法语句子标记器,并将该字符串拆分为一个句子列表:
nltk.data.load('tokenizers/punkt/french.pickle')
tokens = [french_tokenizer.tokenize(s) for s in sentences]
尝试使用WhiteSpaceTokenizer将句子拆分为单词:
from nltk.tokenize import WhitespaceTokenizer
wst = WhitespaceTokenizer()
tokens = [wst.tokenize(s) for s in sentences]
这是我卡住的地方,原因如下:
对于英文,我可以像这样标记和分块文本:
tagged = [nltk.pos_tag(token) for token in tokens]
chunks = nltk.batch_ne_chunk(tagged)
我的主要选项(按照当前偏好的顺序)似乎是:
如果我要做(1),我想我需要创建自己的标记语料库。 这是正确的,还是有可能(并预先)使用法国的Treebank?
如果法语Treebank语料库格式(此处为示例)不适合与nltk-trainer一起使用,将其转换为这种格式是否可行?
NLTK的法语用户采用PoS标签和大块文本的方法是什么?
从版本3.1.0(2012年1月)开始,斯坦福PoS tagger支持法语。
应该可以在NLTK中使用这个法语标记器,使用Nitin Madnani与斯坦福POS-标记器的接口
我还没有尝试过,但它听起来比我考虑的其他方法更容易,我应该能够从Python脚本中控制整个管道。 当我有共享的结果时,我会对此帖子发表评论。
还有一个带有Python包装的TreeTagger(支持法语语料库)。 这是我目前使用的解决方案,而且效果很好。
这里有一些建议:
WhitespaceTokenizer
正在做它的意义。 如果您想分离撇号,请尝试WordPunctTokenizer
,查看其他可用的标记器,或者使用Regexp标记器或直接使用re
模块编辑您自己的标记器。
确保你已经解决了文本编码问题(unicode或latin1),否则标记仍然会出错。
正如你发现的那样,nltk只有英文标签。 这听起来像使用TreeTagger将是最少的工作,因为它(几乎)准备好使用。
训练你自己也是一个实际的选择。 但你绝对不应该创建自己的训练语料库! 使用现有的法语标记语料库。 如果培训文字的类型与您的域(文章)匹配,您将获得最佳结果。 另外,您可以使用nltk-trainer,但也可以直接使用NLTK功能。
您可以使用法语Treebank语料库进行培训,但我不知道是否有读者知道其确切格式。 如果没有,您必须从XMLCorpusReader开始,并将其子类化以提供tagged_sents()方法。
如果你还不在nltk-users邮件列表中,我想你会想要继续。
上一篇: How can I tag and chunk French text using NLTK and Python?
下一篇: Chunking with nltk