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


我在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]
    

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

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

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

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

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

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

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

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

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


4800
2018-03-12 08:42


起源



答案:


从版本3。1。0(2012年1月)开始, 斯坦福PoS标记 支持法语。

应该可以在NLTK中使用这个法语标记器,使用Nitin Madnani 与Stanford POS-tagger的接口

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


5
2018-03-13 02:56



斯坦福PoS标记器充满了法语的原始html和英语单词混合我不推荐解决方案 - c24b
斯坦福PoS标记器似乎不是性能方面的最佳方式。将Python与JVM混合并不是一种真正的pythonic方式。 - toshiro92


答案:


从版本3。1。0(2012年1月)开始, 斯坦福PoS标记 支持法语。

应该可以在NLTK中使用这个法语标记器,使用Nitin Madnani 与Stanford POS-tagger的接口

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


5
2018-03-13 02:56



斯坦福PoS标记器充满了法语的原始html和英语单词混合我不推荐解决方案 - c24b
斯坦福PoS标记器似乎不是性能方面的最佳方式。将Python与JVM混合并不是一种真正的pythonic方式。 - toshiro92


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


5
2017-08-10 17:05





以下是一些建议:

  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邮件列表,我想你会想要加入它。


4
2018-03-12 10:28



+1 WordPunctTokenizer。如果有法国树库,那么这可能是培训pos tagger的重要资源。如果它需要创建一个自定义语料库阅读器,那么我肯定NLTK会很乐意将它包括在内。完成后,nltk-trainer支持指定自定义语料库阅读器。 - Jacob
谢谢亚历克西斯和雅各布。我不知道现有的标记法语语料库,所以我可能会先尝试使用TreeTagger。正如你所说,它可能比编写自定义语料库阅读器阅读法国树库更容易。感谢您的建议:nltk-users邮件列表。我在Web存档上阅读了一些以前的帖子,但忘记了订阅。 - Rahim