我试图通过以下方式将字符串拆分为标记(通过正则表达式):
示例#1
输入字符串:'hello'
第一个令牌:'
第二个令牌:hello
第三个令牌:'
示例#2
输入字符串:'hello world'
第一个令牌:'
第二个令牌:hello world
第三个令牌:'
示例#3
输入字符串:hello world
第一个令牌:hello
第二个令牌:world
即,如果字符串不是单引号,则只拆分字符串,并且单引号应该在它们自己的标记中.
这是我到目前为止:
string pattern = @"'|\s";
Regex RE = new Regex(pattern);
string[] tokens = RE.Split("'hello world'");
Run Code Online (Sandbox Code Playgroud)
这将适用于例如#1和示例#3,但它不适用于示例#2.我想知道理论上是否有办法用正则表达式实现我想要的东西
如果使用Boost标记生成器处理了字符串,则可以获取给定标记迭代器指向的原始字符串中的位置:
boost:tokenizer<> tok( "this is the original string" );
for(tokenizer<>::iterator it=tok.begin(); it!=tok.end();++it)
{
std::string strToken = *it;
int charPos = it.? /* IS THERE A METHOD? */
}
Run Code Online (Sandbox Code Playgroud)
我意识到我可以使用已定义的'keep delimiters'列表创建一个特定的char_separator并指定keep_empty_tokens来尝试跟踪迭代器的进度,但我希望有一种更简单的方法只使用迭代器本身.
我是自然语言处理的新手,我对使用的术语感到困惑.
什么是标记化?POS标签?实体识别?
标记化只是将文本分成可能具有含义或赋予这些部分含义的部分?意思是什么,当我确定某事物是名词,动词还是反对时,这个名字是什么.如果我想分成日期,名字,货币?
我需要一个关于NLP中使用的区域/术语的简单解释.
在Java中,如果我有一个这种格式的字符串:
( string1 , string2 ) ( string2 ) ( string4 , string5 , string6 ) [s2]
Run Code Online (Sandbox Code Playgroud)
如何拆分字符串以获取字符串数组?
string1 , string2
string2
string4 , string5 , string6
Run Code Online (Sandbox Code Playgroud) 我在https://github.com/FLCLjp/iPhone-libmecab上找到了用于MeCab的iPhone库.我无法将其标记为所有可能的单词.具体来说,我不能将"吉本兴业"分为两部分"吉本"和"兴业".我可以使用任何选项来解决这个问题吗?iPhone库没有暴露任何东西,但它在objective-c包装器下使用C++.我假设必须有某种设置我可以更改以提供更细粒度的控制,但我不知道从哪里开始.
顺便说一句,如果有人想要标记这可能是合适的'mecab'.我还不允许创建新标签.
更新:iOS库调用libmecab.cpp中定义的mecab_sparse_tonode2().如果有人能指出我在该文件上的一些英文文档,那就足够了.
我想标记一个由整数,浮点数,运算符,函数,变量和括号组成的字符串.以下示例应该提亮问题的本质:
当前状态:
String infix = 4*x+5.2024*(Log(x,y)^z)-300.12
Run Code Online (Sandbox Code Playgroud)
期望的状态:
String tokBuf[0]=4
String tokBuf[1]=*
String tokBuf[2]=x
String tokBuf[3]=+
String tokBuf[4]=5.2024
String tokBuf[5]=*
String tokBuf[6]=(
String tokBuf[7]=Log
String tokBuf[8]=(
String tokBuf[9]=x
String tokBuf[10]=,
String tokBuf[11]=y
String tokBuf[12]=)
String tokBuf[13]=^
String tokBuf[14]=z
String tokBuf[15]=)
String tokBuf[16]=-
String tokBuf[17]=300.12
Run Code Online (Sandbox Code Playgroud)
所有提示和解决方案将不胜感激.
任何机构都可以告诉我在java脚本中拆分一个字符串,该空格不在单引号内.
就像字符串一样
"0 60 120 180 'node name' 2 34 45 12"
然后它将这样标记化
arr[0]=0 arr[1]=60 arr[2]=120 arr[3]=180 arr[4]='node name' arr[5]=2 arr[6]=34 arr[7]=45 arr[8]=12
在拆分期间,如果单引号删除,那么也很好,因为这是图表中的图例名称,我必须在单个元素中获取该名称
基本上我想删除所有空格并将整个字符串标记为单个标记.(稍后我将使用nGram.)
这是我的索引设置:
"settings": {
"index": {
"analysis": {
"filter": {
"whitespace_remove": {
"type": "pattern_replace",
"pattern": " ",
"replacement": ""
}
},
"analyzer": {
"meliuz_analyzer": {
"filter": [
"lowercase",
"whitespace_remove"
],
"type": "custom",
"tokenizer": "standard"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
相反的"pattern": " ",我试过"pattern": "\\u0020"和\\s,太.
但是,当我分析文本"beleza na web"时,它仍会创建三个单独的标记:"beleza","na"和"web",而不是一个单独的"belezanaweb".
直接问题:
这段代码,
#include <iostream>
using namespace std;
int main() {
std::string string = "9 9";
std::cout << string;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
9 9作为输出返回.
但是,在输入9 9此代码时,
#include <iostream>
using namespace std;
int main() {
std::string string;
std::cin >> string;
std::cout << string;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它输出9.为什么会这样?
我想这与空间有关,但有什么办法可以避免这种情况吗?我必须说空间是数字之间唯一有效的分离.
我已经编写了许多简单的标记器和递归下降解析器,因此我熟悉它们如何工作的基本概念。但是当我偶然发现以下Rust代码时,我感到很惊讶:
Option<Option<i32>>
Run Code Online (Sandbox Code Playgroud)
我们知道Rust具有>>移位运算符,因此我认为天真的令牌生成器会>>在此处输出令牌,解析器将其视为错误(因为它期望使用两个>令牌)。
但显然Rust编译器了解情况并正确处理。这里发生了什么?
>>并将其分成两个令牌,然后将其推回到令牌流中?