如何使用NLTK和Python标记和分块法语文本?

Rah*_*him 11 python nlp nltk

我在JSON文件中有30,000多个法语文章.我想对单个文章和整个集合进行一些文本分析.在我走得更远之前,我从简单的目标开始:

  • 识别重要的实体(人,地方,概念)
  • 发现这些实体在一段时间内的重要性(〜=频率)发生了重大变化(使用文章序列号作为时间的代理)

到目前为止我采取的步骤:

  1. 将数据导入python列表:

    import json
    json_articles=open('articlefile.json')
    articlelist = json.load(json_articles)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 选择要测试的单个文章,并将正文文本连接成单个字符串:

    txt =  ' '.join(data[10000]['body'])
    
    Run Code Online (Sandbox Code Playgroud)
  3. 加载一个法语句子标记化器并将该字符串拆分为一个句子列表:

    nltk.data.load('tokenizers/punkt/french.pickle')
    tokens = [french_tokenizer.tokenize(s) for s in sentences]
    
    Run Code Online (Sandbox Code Playgroud)
  4. 尝试使用WhiteSpaceTokenizer将句子拆分为单词:

    from nltk.tokenize import WhitespaceTokenizer
    wst = WhitespaceTokenizer()
    tokens = [wst.tokenize(s) for s in sentences]
    
    Run Code Online (Sandbox Code Playgroud)

这是我被卡住的地方,原因如下:

  • NLTK没有可以将法语分成单词的内置标记器.白色空间不能很好地工作,特别是因为它不会在撇号上正确分离.
  • 即使我使用正则表达式分成单个单词,也没有法语PoS(词性)标记符可用于标记这些单词,并且无法将它们分成逻辑单元的意义

对于英语,我可以像这样标记和分块文本:

    tagged = [nltk.pos_tag(token) for token in tokens]
    chunks = nltk.batch_ne_chunk(tagged)
Run Code Online (Sandbox Code Playgroud)

我的主要选项(按当前偏好顺序)似乎是:

  1. 使用nltk-trainer训练我自己的tagger和chunker.
  2. 使用TreeTagger的python包装器只是这部分,因为TreeTagger已经可以标记法语,并且有人编写了一个调用TreeTagger二进制文件并解析结果的包装器.
  3. 完全使用不同的工具.

如果我做(1),我想我需要创建自己的标记语料库.这是正确的,还是可以(并且允许)使用法国树库?

如果法国树库语料库格式(此处示例)不适合与nltk-trainer一起使用,将它转换为这种格式是否可行?

将NLTK的法语用户采用PoS标签和块文本的方法是什么?

Rah*_*him 5

从版本3.1.0(2012年1月)开始,斯坦福PoS标记器支持法语.

应该可以在NLTK中使用这个法语标记器,使用Nitin Madnani的接口到斯坦福POS标记器

我还没有尝试过,但这听起来比我考虑的其他方法更容易,我应该能够在Python脚本中控制整个管道.当我有分享的结果时,我会评论这篇文章.


gab*_*ous 5

还有TreeTagger(支持法语语料库)和Python包装器.这是我目前正在使用的解决方案,它的效果非常好.


ale*_*xis 4

以下是一些建议:

  1. WhitespaceTokenizer正在做它应该做的事。如果您想按撇号进行拆分,请尝试WordPunctTokenizer查看其他可用的标记生成器,或者使用 Regexp 标记生成器或直接使用模块来推出您自己的标记生成器re

  2. 确保您已经解决了文本编码问题(unicode 或 latin1),否则标记化仍然会出错。

  3. 正如您所发现的,nltk 仅附带英文标记器。听起来使用 TreeTagger 是最少的工作,因为它(几乎)已经可以使用了。

  4. 自己培训也是一个实用的选择。但你绝对不应该创建自己的训练语料库!使用现有的法语标记语料库。如果训练文本的类型与您的领域(文章)匹配,您将获得最佳结果。此外,您可以使用 nltk-trainer,但也可以直接使用 NLTK 功能。

  5. 可以使用French Treebank语料库进行训练,但不知道有读者是否知道其具体格式。如果没有,您必须从 XMLCorpusReader 开始,并将其子类化以提供 tagged_sents() 方法。

  6. 如果您尚未加入 nltk-users 邮件列表,我想您会想要加入其中。