是否有Java 的shlex替代品?我希望能够分割引号分隔的字符串,就像shell会处理它们一样.例如,如果我发送:
one two "three four"并执行拆分,我想收到令牌
one
two
three four
NLTK的默认标记器nltk.word_tokenizer链接两个标记器,一个句子标记器,然后是一个对句子进行操作的单词标记器.它的开箱即用相当不错.
>>> nltk.word_tokenize("(Dr. Edwards is my friend.)")
['(', 'Dr.', 'Edwards', 'is', 'my', 'friend', '.', ')']
Run Code Online (Sandbox Code Playgroud)
我想使用相同的算法,除了让它将偏移元组返回到原始字符串而不是字符串标记.
通过偏移我的意思是2-ples可以作为原始字符串的索引.比如我在这里
>>> s = "(Dr. Edwards is my friend.)"
>>> s.token_spans()
[(0,1), (1,4), (5,12), (13,15), (16,18), (19,25), (25,26), (26,27)]
Run Code Online (Sandbox Code Playgroud)
因为s [0:1]是"(",s [1:4]是"博士"等等.
有没有一个NLTK调用可以做到这一点,还是我必须编写自己的偏移算术?
我需要在C++中创建字符串解析器.我试过用
vector<string> Tokenize(const string& strInput, const string& strDelims)
{
vector<string> vS;
string strOne = strInput;
string delimiters = strDelims;
int startpos = 0;
int pos = strOne.find_first_of(delimiters, startpos);
while (string::npos != pos || string::npos != startpos)
{
if(strOne.substr(startpos, pos - startpos) != "")
vS.push_back(strOne.substr(startpos, pos - startpos));
// if delimiter is a new line (\n) then add new line
if(strOne.substr(pos, 1) == "\n")
vS.push_back("\\n");
// else if the delimiter is not a space
else if (strOne.substr(pos, 1) != " ") …Run Code Online (Sandbox Code Playgroud) 我目前正在使用NLTK进行语言处理,但我遇到了句子标记化的问题.
问题在于:假设我有一句话:"图2显示了美国地图." 当我使用punkt tokenizer时,我的代码如下所示:
from nltk.tokenize.punkt import PunktSentenceTokenizer, PunktParameters
punkt_param = PunktParameters()
abbreviation = ['U.S.A', 'fig']
punkt_param.abbrev_types = set(abbreviation)
tokenizer = PunktSentenceTokenizer(punkt_param)
tokenizer.tokenize('Fig. 2 shows a U.S.A. map.')
Run Code Online (Sandbox Code Playgroud)
它返回:
['Fig. 2 shows a U.S.A.', 'map.']
Run Code Online (Sandbox Code Playgroud)
标记器无法检测缩写"USA",但它在"fig"上工作.现在当我使用默认的tokenizer时,NLTK提供:
import nltk
nltk.tokenize.sent_tokenize('Fig. 2 shows a U.S.A. map.')
Run Code Online (Sandbox Code Playgroud)
这次我得到:
['Fig.', '2 shows a U.S.A. map.']
Run Code Online (Sandbox Code Playgroud)
它承认更常见的"美国",但没有看到"无花果"!
我该如何结合这两种方法?我想使用默认缩写选项以及添加我自己的缩写.
我一直在寻找boost :: tokenizer,我发现文档很薄.是否有可能使它像一个像"海豚 - 猴子 - 狒狒"这样的字符串进行标记,并使每一个字都成为一个标记,以及每一个双字母都是一个标记?从示例中我只看到允许单个字符分隔符.库是否不够先进,不适合更复杂的分隔符?
我需要拆分一个字符串并提取由空白字符分隔的单词.来源可能是英文或日文.英文空白字符包括制表符和空格,日文文本也使用这些字符.(IIRC,所有广泛使用的日语字符集都是US-ASCII的超集.)
因此,我需要用来分割字符串的字符集包括普通的ASCII空格和制表符.
但是,在日语中,还有另一个空格字符,通常称为"全宽空间".根据我Mac的角色查看器实用程序,这是U + 3000"IDEOGRAPHIC SPACE".这是(通常)当用户在日语输入模式下键入时按空格键时的结果.
我还需要考虑其他角色吗?
我正在处理被告知"用空格分隔条目"的用户提交的文本数据.但是,用户正在使用各种计算机和移动电话操作系统来提交这些文本.我们已经看到用户在输入此数据时可能不知道他们是处于日语输入模式还是英语输入模式.
此外,即使在日语模式下,空间键的行为也会因平台和应用程序而异(例如,Windows 7将插入表意空间,但iOS将插入ASCII空间).
所以我想要的基本上是"视觉上看起来像空格的所有角色的集合,可能是在用户按空格键时生成的,或者是tab键,因为许多用户不知道空格和制表符之间的区别,日语和/或英语".
对这样的问题有任何权威的答案吗?
我正在创建一个语法高亮显示器,我使用String.split从输入字符串创建令牌.第一个问题是String.split创建了大量的空字符串,这导致一切都比它原本要慢得多.
例如,"***".split(/(\*)/)- > ["", "*", "", "*", "", "*", ""].有办法避免这种情况吗?
另一个问题是正则表达式本身的表达式优先级.假设我正在尝试解析C风格的多行注释.就是这样/* comment */.现在让我们假设输入字符串是"/****/".如果我使用下面的正则表达式,它会起作用,但产生许多额外的标记(以及所有那些空字符串!).
/(\/\*|\*\/|\*)/
Run Code Online (Sandbox Code Playgroud)
更好的方法是读取/*'s,*/然后*在一个标记中读取所有其余的.也就是说,上述字符串的更好结果是["/*", "**", "*/"].但是,当使用应该执行此操作的正则表达式时,我会得到错误的结果.正则表达式如下:/(\/\*|\*\/|\*+)/.
然而,这个表达式的结果如下:["/*", "***", "/"].我猜这是因为最后一部分是贪婪的,所以它从其他部分窃取了比赛.
我找到的唯一解决方案是制作一个否定的前瞻表达式,如下所示:
/(\/\*|\*\/|\*+(?!\/)/
Run Code Online (Sandbox Code Playgroud)
这给出了预期的结果,但与其他结果相比它非常慢,这对大字符串有影响.
是否有解决这些问题的方法?
我目前在word2vec模型中使用uni-gram,如下所示.
def review_to_sentences( review, tokenizer, remove_stopwords=False ):
#Returns a list of sentences, where each sentence is a list of words
#
#NLTK tokenizer to split the paragraph into sentences
raw_sentences = tokenizer.tokenize(review.strip())
sentences = []
for raw_sentence in raw_sentences:
# If a sentence is empty, skip it
if len(raw_sentence) > 0:
# Otherwise, call review_to_wordlist to get a list of words
sentences.append( review_to_wordlist( raw_sentence, \
remove_stopwords ))
#
# Return the list of sentences (each sentence is a list of …Run Code Online (Sandbox Code Playgroud) >>> t = Tokenizer(num_words=3)
>>> l = ["Hello, World! This is so&#$ fantastic!", "There is no other world like this one"]
>>> t.fit_on_texts(l)
>>> t.word_index
{'fantastic': 6, 'like': 10, 'no': 8, 'this': 2, 'is': 3, 'there': 7, 'one': 11, 'other': 9, 'so': 5, 'world': 1, 'hello': 4}
Run Code Online (Sandbox Code Playgroud)
我原本预计t.word_index会有前3个单词.我究竟做错了什么?
machine-learning tokenize neural-network deep-learning keras
“令牌”和“特殊令牌”到底有什么区别?
\n我了解以下内容:
\n我不明白的是,您想要在什么样的容量下创建新的特殊令牌,我们需要它的任何示例以及何时想要创建除默认特殊令牌之外的特殊令牌?如果一个示例使用特殊令牌,为什么普通令牌不能实现相同的目标?
\ntokenizer.add_tokens(['[EOT]'], special_tokens=True)\nRun Code Online (Sandbox Code Playgroud)\n而且我也不太明白源文档中的以下描述。\n如果我们将 add_special_tokens 设置为 False,这对我们的模型有什么区别?
\nadd_special_tokens (bool, optional, defaults to True) \xe2\x80\x94 Whether or not to encode the sequences with the special tokens relative to their model.\nRun Code Online (Sandbox Code Playgroud)\n nlp tokenize bert-language-model huggingface-transformers huggingface-tokenizers