我如何根据姓名、数字、金钱、日期等对文本中的单词进行分类?
Posted
技术标签:
【中文标题】我如何根据姓名、数字、金钱、日期等对文本中的单词进行分类?【英文标题】:How I classify a word of a text in things like names, number, money, date,etc? 【发布时间】:2011-10-17 03:44:44 【问题描述】:一周前我做了一些关于文本挖掘的问题,但我有点困惑,但现在我知道我想做 wgat。
情况:我有很多带有 html 内容的下载页面。例如,其中一些可以是来自博客的文本。它们没有结构化并且来自不同的站点。
我想要做什么:我将用空格分割所有单词,并且我想将每个单词或一组单词分类为一些预定义的项目,如姓名、数字、电话、电子邮件、网址、日期、金钱、温度等
我所知道的:我知道/听说过有关自然语言处理、命名实体识别器、POSTagging、NayveBayesian、HMM、培训和许多分类等方面的概念,但是有一些不同的 NLP 库具有不同的分类器和执行此操作的方法,我不知道有什么用途或做什么。
我需要什么:我需要一些来自分类器、NLP 等的代码示例,它可以将每个单词从文本中单独分类,而不是整个文本。像这样的:
//This is pseudo-code for what I want, and not a implementation
classifier.trainFromFile("file-with-train-words.txt");
words = text.split(" ");
for(String word: words)
classifiedWord = classifier.classify(word);
System.out.println(classifiedWord.getType());
有人可以帮助我吗?我对各种 API、分类器和算法感到困惑。
【问题讨论】:
【参考方案1】:这个问题是来自不同领域的几个想法的交集。您提到命名实体识别,就是其中之一。但是,您可能正在查看part of speech tagging(用于名词、名称等)和information extraction(用于数字、电话号码、电子邮件)的混合体。
不幸的是,这样做并使其适用于真实的工作数据需要一些努力,而且它并不像使用这个或那个 API 那样简单。
【讨论】:
【参考方案2】:您可以为此任务使用命名实体识别器 (NER) 方法,我强烈建议您查看 Stanford Core NLP page 并在模块中为您的任务使用 ner
功能。您可以将句子分解为标记,然后将它们传递给斯坦福 NER 系统。
我认为斯坦福核心 NLP 页面有很多示例可以帮助您,如果您需要玩具代码,请告诉我。
这里是示例代码,这只是整个代码的sn-p:
// creates a StanfordCoreNLP object, with NER
Properties props = new Properties();
props.put("annotators", "ner");
StanfordCoreNLP pipeline = new StanfordCoreNLP(props);
classifier.trainFromFile("file-with-train-words.txt");
words = text.split(" ");
for(String word: words)
Annotation document = new Annotation(word);
pipeline.annotate(document);
System.out.println(Annotation);
【讨论】:
哦,谢谢。你可以解释我如何训练 StanfordCoreNLP 使用我想要的一些定义?我看到它只带有 7 个预定义的实体。 您能否查看:nlp.stanford.edu/software/crf-faq.shtml 了解有关基于 NER 的自定义分类器的详细信息。 如果您阅读常见问题解答,它包含训练自定义分类器的步骤。 -1,你不能单独对一个词进行分类。这样,您会错过单词上下文(其他单词),并且您将无法区分,例如日期和电话号码。 同意。但是,如果一个好的模型已经被训练过,我提交整个字符串还是只提交标记有关系吗?【参考方案3】:你应该试试Apache OpenNLP。它易于使用和定制。
如果您使用的是葡萄牙语,那么项目文档中会提供有关如何使用 Amazonia Corpus 进行操作的信息。支持的类型有:
人、组织、组、地点、事件、ArtProd、抽象、事物、时间和数字。
下载 OpenNLP 和 Amazonia Corpus。提取两者并将文件amazonia.ad
复制到apache-opennlp-1.5.1-incubating
文件夹。
执行TokenNameFinderConverter工具将Amazonia语料库转换为OpenNLP格式:
bin/opennlp TokenNameFinderConverter ad -encoding ISO-8859-1 -data amazonia.ad -lang pt > corpus.txt
训练你的模型(将编码更改为corpus.txt文件的编码,这应该是你的系统默认编码。这个命令可能需要几分钟):
bin/opennlp TokenNameFinderTrainer -lang pt -encoding UTF-8 -data corpus.txt -model pt-ner.bin -cutoff 20
从命令行执行(你应该只执行一个句子,并且要分开标记):
$ bin/opennlp TokenNameFinder pt-ner.bin
Loading Token Name Finder model ... done (1,112s)
Meu nome é João da Silva , moro no Brasil . Trabalho na Petrobras e tenho 50 anos .
Meu nome é <START:person> João da Silva <END> , moro no <START:place> Brasil <END> . <START:abstract> Trabalho <END> na <START:abstract> Petrobras <END> e tenho <START:numeric> 50 anos <END> .
使用 API 执行它:
InputStream modelIn = new FileInputStream("pt-ner.bin");
try
TokenNameFinderModel model = new TokenNameFinderModel(modelIn);
catch (IOException e)
e.printStackTrace();
finally
if (modelIn != null)
try
modelIn.close();
catch (IOException e)
// load the name finder
NameFinderME nameFinder = new NameFinderME(model);
// pass the token array to the name finder
String[] toks = "Meu","nome","é","João","da","Silva",",","moro","no","Brasil",".","Trabalho","na","Petrobras","e","tenho","50","anos",".";
// the Span objects will show the start and end of each name, also the type
Span[] nameSpans = nameFinder.find(toks);
要评估您的模型,您可以使用 10 折交叉验证:(仅在 1.5.2-INCUBATOR 中可用,今天要使用它,您需要使用 SVN 主干)(可能需要几个小时)
bin/opennlp TokenNameFinderCrossValidator -lang pt -encoding UTF-8 -data corpus.txt -cutoff 20
通过使用自定义特征生成(查看文档)提高精度/召回率,例如通过添加名称字典。
【讨论】:
【参考方案4】:您必须创建特定的函数来提取和检测每种数据类型及其错误。
或者作为其众所周知的面向对象的方式。 IE。为了检测货币,我们所做的是在开头或结尾检查美元符号,并检查是否有附加的非数字字符,这意味着错误。
你应该用你的思想写下你已经在做的事情。如果你遵守规则,这并不难。 机器人/人工智能有 3 条黄金法则:
-
分析它。
简化它
数字化。
这样你就可以和电脑对话了。
【讨论】:
请尝试给出明确的答案。如果我们其他人无法理解,那么 OP 可能无法理解您以上是关于我如何根据姓名、数字、金钱、日期等对文本中的单词进行分类?的主要内容,如果未能解决你的问题,请参考以下文章
Silverstripe 3:如何按标题,日期等对CMS网站树中的页面进行排序
如何在包含单词、三个字母月份和两位数字年份的字符串中搜索月份和年份并将它们转换为 SQL 中的日期?