我正在寻求实现Shunting-yard算法,但我需要一些帮助来确定将字符串分成其标记的最佳方法是什么.
如果您注意到,该算法的第一步是"读取令牌".这不是一件非常重要的事情.令牌可以包括数字,运算符和parens.
如果你做的事情如下:
(5 + 1)
一个简单的string.split()会给我一个标记数组{"(","",","+","1",")"}.
但是,如果您有多个数字的数字会变得更加复杂,例如:
((2048*124)+ 42)
现在一个天真的string.split()不会做的伎俩.多位数是一个问题.
我知道我可以写一个词法分析器,但有没有办法在不写一个完整的词法分析器的情况下做到这一点?
我在JavaScript中实现这一点,我想避免在可能的情况下沿着词法路径走.我将使用"*","+"," - "和"/"运算符以及整数.
我有这个代码
void split(vector<float> &fvec, string str)
{
int place = 0;
for(int i=0; i<str.length(); i++)
{
if(str.at(i) == ' ')
{
fvec.push_back(atoi(str.substr(place,i-place).c_str()));
place=i+1;
}
}
fvec.push_back(atoi(str.substr(place).c_str()));
}
Run Code Online (Sandbox Code Playgroud)
我试图做的是将一个向量的引用传递给方法,所以它拆分字符串我给它浮动而不复制向量...我不想复制向量,因为它将包含1000的数字.
是不是可以通过引用传递一个向量,或者我只是犯了一个愚蠢的错误?
如果它有助于继承代码我测试它
int main (void)
{
vector<float> fvec;
string str = "1 2 2 3.5 1.1";
split(&fvec, str);
cout<<fvec[0];
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我需要标记一个字符串,其中有多个空格.
例如
"HUNTSVILLE, AL 30 39.8 44.3 52.3"
Run Code Online (Sandbox Code Playgroud)
变
"HUNTSVILLE, AL","30","39.8","44.3","52.3"
Run Code Online (Sandbox Code Playgroud)
StringTokenizer st = new StringTokenizer(str, " ");
Run Code Online (Sandbox Code Playgroud)
只是标记任何空格,我无法弄清楚正则表达式做我需要的.
谢谢
我需要创建一个lexer/parser来处理可变长度和结构的输入数据.
假设我有一个保留关键字列表:
keyWordList = ['command1', 'command2', 'command3']
Run Code Online (Sandbox Code Playgroud)
和用户输入字符串:
userInput = 'The quick brown command1 fox jumped over command2 the lazy dog command 3'
userInputList = userInput.split()
Run Code Online (Sandbox Code Playgroud)
我将如何编写此函数:
INPUT:
tokenize(userInputList, keyWordList)
OUTPUT:
[['The', 'quick', 'brown'], 'command1', ['fox', 'jumped', 'over'], 'command 2', ['the', 'lazy', 'dog'], 'command3']
Run Code Online (Sandbox Code Playgroud)
我编写了一个可以识别关键字的标记化程序,但是无法找到一种将非关键字组嵌入到更深层次的列表中的有效方法.
RE解决方案是受欢迎的,但我真的希望看到底层算法,因为我可能会将应用程序扩展到其他对象的列表而不仅仅是字符串.
我希望能够在SQLite中使用FTS4搜索2.3这样的数字,但是.被视为令牌边界.如果没有编写完整的定制标记器,还有其他方法可以排除.从令牌边界字符列表?
能够搜索十进制数字似乎是一个常见的用例,但我在SO/Google上找不到任何相关内容.我目前最好的解决方案是替换所有.文本中的字符带有一个已知的(长)字母串,并相应地替换每个搜索...
彼得
我想将一个String拆分成存储在数组中的标记.但是我不认为我能够使用分隔符,因为字符串信息没有被特定的字符集分隔开.但是,信息总是由不同数量的空白区分开.
像这样:
0 147 530.936 1 656.336 -1.12709 656.336 -0.52921 -0.0131993 -0.882138 0 20 0 0 0.878423 0 1.4013E-045 0
Run Code Online (Sandbox Code Playgroud)
我的问题是,有没有办法使用不同数量的空格作为分隔符,以便对字符串进行标记化?
当对句点字符''进行标记时,XSLT的tokenize函数无法正常工作.
-
下面是我对逗号字符进行标记时会发生什么的示例:
XML文件:
<value>a,b,c</value>
Run Code Online (Sandbox Code Playgroud)
XSLT文件:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:template match="/">
<firsttoken><xsl:value-of select="tokenize(/value,',')[1]" /></firsttoken>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
输出:
<firsttoken>a</firsttoken>
Run Code Online (Sandbox Code Playgroud)
-
这是相同的示例,但在句点字符上进行标记:
XML文件:
<value>a.b.c</value>
Run Code Online (Sandbox Code Playgroud)
XSLT文件:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:template match="/">
<firsttoken><xsl:value-of select="tokenize(/value,'.')[1]" /></firsttoken>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
输出:
<firsttoken/>
Run Code Online (Sandbox Code Playgroud)
-
我无法解释为什么它适用于逗号但不适用于句号.
我只是学习Swift并使用CFStringTokenizer,我注意到当字符串被标记化时,标点符号和符号被忽略.我对Tokenization这个主题不太熟悉,但我想更好地理解tokenizer如何工作,如果我需要做更复杂的标记化,需要我找到诸如"!"之类的东西.或"+".任何帮助将不胜感激.
所以我的问题是:
这是我一直在使用的游乐场:
import Cocoa
var str = "I have 2 pairs of pants + five shirts, but threw out 3 socks with holes! 2+5-3"
var tokens: [(token: String, range: CFRange, type: CFStringTokenizerTokenType)] = []
var strLen = countElements(str)
var strRng = CFRangeMake(0, strLen)
var flag = UInt(kCFStringTokenizerUnitWord)
var locale = CFLocaleCopyCurrent()
var tknizr = CFStringTokenizerCreate( kCFAllocatorDefault, str, strRng, flag, locale)
var tknType = CFStringTokenizerAdvanceToNextToken(tknizr)
do {
var tRng = CFStringTokenizerGetCurrentTokenRange(tknizr)
var from = advance(str.startIndex, …Run Code Online (Sandbox Code Playgroud) 我正在寻找在nltk中使用stanford字标记器的方法,我想使用,因为当我比较stanford和nltk字标记器的结果时,它们都是不同的.我知道可能有办法使用stanford tokenizer,就像我们可以在NLTK中支持POS Tagger和NER一样.
是否可以在不运行服务器的情况下使用stanford tokenizer?
谢谢
我有一个像这样的字符串:
sentence = 'This is a nice day'
Run Code Online (Sandbox Code Playgroud)
我想要以下输出:
output = ['This is', 'a nice', 'day']
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我将字符串分割为n= 3或更多的空格,这就是为什么像上面显示的那样分割字符串。
我怎样才能有效地做到这一点n?