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

时间:2012-03-12 08:42:11

标签: python nlp nltk

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

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

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

  1. 将数据导入python列表:

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

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

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

    from nltk.tokenize import WhitespaceTokenizer
    wst = WhitespaceTokenizer()
    tokens = [wst.tokenize(s) for s in sentences]
    
  5. 这是我被困的地方,原因如下:

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

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

        tagged = [nltk.pos_tag(token) for token in tokens]
        chunks = nltk.batch_ne_chunk(tagged)
    

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

    1. 使用nltk-trainer训练我自己的标记器和块。
    2. 将TreeTagger的python包装器用于此部分,因为TreeTagger已经可以标记法语,并且有人编写了一个调用TreeTagger二进制文件并解析结果的包装器。
    3. 完全使用其他工具。
    4. 如果我要做(1),我想我需要创建自己的标记语料库。这是正确的,还是可以(并允许)使用法国树库?

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

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

3 个答案:

答案 0 :(得分:5)

自版本3。1。0(2012年1月)起,Stanford PoS tagger支持法语。

应该可以在NLTK中使用这个法语标记,使用Nitin Madnani的Interface to the Stanford POS-tagger

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

答案 1 :(得分:5)

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

答案 2 :(得分:4)

以下是一些建议:

  1. WhitespaceTokenizer正在做它的意图。如果要拆分撇号,请尝试WordPunctTokenizer,查看其他可用的令牌化程序,或使用Regexp tokenizer或直接使用re模块滚动。

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

  3. 正如您所发现的那样,nltk只附带英文标记。听起来使用TreeTagger是最不起作用的,因为它(几乎)准备好使用。

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

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

  6. 如果您尚未加入nltk-users邮件列表,我认为您希望加入它。