天道酬勤,学无止境

如何使用Java检查句子中是否存在单词? [复制](How to check if a word is present in a sentence using Java? [duplicate])

问题

我是编程新手,正在研究一个函数,如果一个词出现在句子中,则返回 true。 我尝试了indexOf()方法,但后来我也遇到了这种方法的某个问题:

假设我的句子是I am a, Java Programmer.

如果我们使用indexOf()方法查找单词ram ,那么它将返回true因为ram存在于Programmer而正确的输出应该是false因为ram不是作为单词而是作为模式存在的。

我该如何解决这个问题? 我现在使用的代码是:

boolean isPresent(String word, String sentence)
{
    if(sentence.indexOf(word) >= 0)
        return true;
    else
        return false;
}

注意: ram这个词只是一个例子来说明我目前的方法存在的一个问题。并不是说我必须一直只使用ram 。这个词可以是任何像上面说的a后面跟一个逗号句子。

更新:感谢大家提供他们的意见和解决方案。 我选择了一个作为可接受的答案(如果允许的话,我会选择更多:-)),但很多都是有帮助的。

回答1

尝试正则表达式

boolean contains = s.matches(".*\\bram\\b.*");

\b 表示单词边界

回答2

由于您要搜索一个单词,因此有以下三种情况:

  1. 句子开头的单词意味着开头没有空格而结尾有空格。
  2. word两端的句子空间之间。
  3. 词尾只有空格。

为了涵盖所有三种情况,一种可能的解决方案是:

String str = "I am a JAVA programmer";
String[] splited = str.split("\\b+"); //split on word boundries
Arrays.asList(splited).contains("ram"); //search array for word

这是工作演示

回答3

问题:

你如何定义一个词?

可能的答案:

由一些其他字符分隔的字符串。 第二组字符由您选择的字符定义。 假设您选择这些为. ,?; . ,?; . 所以,如果你拆分这些字符(称为分隔符),输入字符串,你会得到一串字符串它们的话。 现在要查找输入是否包含该单词,请遍历这些字符串以检查它们是否与您的查询匹配。

代码:

boolean isPresent(String query, String s) {    
    String [] deli = s.split("[.\\s,?;]+");

    for(int i=0;i<deli.length;i++)
        if(query.equals(deli[i]))
            return true;

    return false;    
}

tl;博士:

如果您希望将一个单词定义为由字母、数字和下划线组成的任何内容,则可以使用正则表达式: \W+

String [] deli = s.split("\\W+");

如果您想了解有关 Java Regex 的更多信息,请考虑阅读本文。

回答4

看看String.matches()方法。 如果您正确构造正则表达式,它应该能够做您想做的事情。 开始学习正则表达式的好地方是 Java 教程:http://docs.oracle.com/javase/tutorial/essential/regex/

回答5

如果你想在句子中匹配一个带有标点符号的单词,你需要一个像这样的正则表达式:

  static boolean matchesWord(String toMatch, String matchIn) {
     return Pattern.matches(".*([^A-Za-z]|^)"+toMatch+"([^A-Za-z]|$).*", matchIn);
  }

(您可以使用 \W,但这不会将下划线视为标点符号。)

仅将空格连接到开头和结尾是不匹配的,例如,字符串“我是 Java 程序员”中的“程序员”一词,因为末尾没有空格。 它也不会直接匹配标点符号之前或之后的单词。

回答6
String s="I am a JAVA programmer";
    String s1="JAVA";
    String []p=s.split("\\s*(=>|,|\\s)\\s*");
        for(int i=0;i<p.length;i++)
        {
            if(s1.equals(p[i]))
            {
                System.out.println(p[i]);
            }

        }
回答7

更简单的方法是:如果您认为一个词类似于

“我的电脑有RAM内存”(空格之间)

您可以在要搜索的单词前后连接到 indexOf 函数空间,如下所示

if (sentence.indexOf(" "+ word +" ") >= 0) {

回答8

这将起作用,假设每个单词都用空格分隔。 为了清楚起见,我添加了主要功能。 如果单词不存在,则 find_str 返回 -1。 否则,它返回单词相对于其他单词的位置。 在这里,将返回 2,这意味着第二个单词是“am”。

import java.util.*;
public class HelloWorld{

    public static void main(String []args){
        String str="I am a Java Programmer";
        String str1="am";
        int x=find_str(str,str1);
        System.out.println(x);

    }

    public static int find_str(String main,String search) {

        int i; 
        int found=-1;

        String[] s=main.split(" ");
        for(i=0;i<s.length;i++)
        {
            if(search.equals(s[i]))
            found=i+1;
        }
        return found;
    }
}
回答9

这是一个相当笨拙的解决方法,但应该能达到正确的结果。 在字符串中找到您要查找的子字符串,并找到子字符串前后的字符。 使用它们的 ascii 值检查这些(int)substring.charAt(x); 看看它们是不是字母。 如果它们都不是字母,或者不在字符串的范围内,那么您就知道找到了一个单词。 否则,您知道它只是单词的一部分。

逻辑会很长——这就是为什么我不为你编码,但试一试,如果你需要澄清,请告诉我。

回答10

喂。 您可以将句子拆分为数组,然后放入列表。 之后,您可以使用 contains 方法来检查您的单词是否存在。 请试试这个代码..

import java.util.ArrayList;
import java.util.Arrays;


 public class karthitest {
  public static void main(String[] args) {
    String sentence = "I am Karthick";
    String word = "I";

    if(isWordExist(sentence, word)){
    System.out.println("Word is exist");
    }
}

public static boolean isWordExist(String sentence, String word){
    boolean ans = Boolean.FALSE;        
    ArrayList<String> wordList = null;

    try {

        if(sentence != null && word != null){
            wordList = new ArrayList<String>(Arrays.asList(sentence.split("[^a-zA-z]+")));              
            if(wordList.contains(word)){
                ans = Boolean.TRUE;
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
        // TODO: handle exception
    }
    return ans;
}

}
回答11

试试这个解决方案

    int index = sent.indexOf(find);
    if (index != -1) {
        if (index == 0) {
            System.out.println("true");
        }
        else if (index + find.length() == sent.length())
        {
            System.out.println("true");
        }
        else if (sent.charAt(index - 1) == ' ' && sent.charAt(find.length() + index) == ' ') {
            System.out.println("true");
        } else {
            System.out.println("false");
        }

    } else {
        System.out.println("false");
    }

如果您想要的不仅仅是原始问题,那么为了检查空格,您应该检查它们是否不在 0-9 和 aZ 之间,这应该涵盖任何字符,例如逗号句点等。

回答12

使用contains 方法

boolean isPresent(String word, String sentence)
{
return sentence.contains(word);   
}

编辑:如果要搜索特定单词,则可以在单词字符串之前和之后添加空格
字 = " " + 字 + " ";

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 检查字符串是否包含特定单词(To check if string contains particular word)
    问题 那么,如何检查字符串中是否包含特定单词呢? 这是我的代码: a.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub if(d.contains("Hey")){ c.setText("OUTPUT: SUCCESS!"); }else{ c.setText("OUTPUT: FAIL!"); } } }); 我遇到了错误。 回答1 并不像他们所说的那么复杂,请勾选此选项,您将不会后悔。 String sentence = "Check this answer and you can find the keyword with this code"; String search = "keyword"; if ( sentence.toLowerCase().indexOf(search.toLowerCase()) != -1 ) { System.out.println("I found the keyword"); } else { System.out.println("not found"); } 您可以根据需要更改toLowerCase() 。 回答2
  • 如何检查两个字符串是否近似相等?(How to check if two Strings are approximately equal?)
    问题 我正在做一个游戏的聊天响应者,我想知道是否有一种方法可以比较两个字符串,看看它们是否彼此近似相等。例如: 如果有人输入:“强度等级?” 它会做一个功能..然后如果有人输入:“ Str level?” 它会做同样的功能,但我想要它,这样如果有人打错字或类似的东西,它会自动检测他们正在尝试输入的内容,例如:“强度 tlevel?” 也会使函数被调用。 我在这里要问的是一些简单的事情,还是需要我做一个很大的刺激函数来检查字符串? 如果您对我的解释感到困惑(这并不是我的强项之一),那么这基本上就是我要问的。 如何检查两个字符串是否彼此相似? 回答1 请参阅以下问答:获取最接近的字符串匹配 使用一些启发式算法和Levenshtein距离算法,您可以计算两个字符串的相似度,并猜测它们是否相等。 除此之外,您唯一的选择就是字典与您正在寻找的单词相似的字典。 回答2 您可以使用 Levenshtein 距离。 回答3 我相信您应该使用一种编辑距离算法来解决您的问题。 例如,这是Java中的Levenstein距离算法实现。 您可以使用它来比较句子中的单词,如果它们的编辑距离总和小于例如句子长度的 10%,则认为它们相等。 回答4 也许您需要的是一本大词典,用于存放相似的单词和常见的拼写错误,您可以使用每个单词将每个单词“翻译”为单个条目或键。 这对于自定义单词很有用,因此您可以在与“强º
  • 如何检查句子是否正确(Python中的简单语法检查)?(How to check whether a sentence is correct (simple grammar check in Python)?)
    问题 如何检查一个句子在Python中是否有效? 例子: I love Stackoverflow - Correct I Stackoverflow love - Incorrect 回答1 查看NLTK。 他们支持语法,您可以使用语法来分析句子。 您可以定义语法,也可以使用提供的语法以及无上下文的解析器。 如果句子解析,则它具有有效的语法; 如果没有,那就没有。 这些语法可能没有最广泛的覆盖范围(例如,它可能不知道如何处理类似StackOverflow的单词),但是这种方法可以让您明确说明语法中什么是有效的还是无效的。 NLTK书籍的第8章介绍了解析,并应解释您需要了解的内容。 一种替代方法是为覆盖面广的解析器(如Stanford解析器或C&C)编写python接口。 这些是统计解析器,即使他们以前没有看过所有单词或语法结构,也能够理解句子。 缺点是有时语法分析器仍会返回语法错误的句子的语法分析,因为它将使用统计信息进行最佳猜测。 因此,这实际上取决于您的目标是什么。 如果要非常精确地控制被认为是语法的内容,请对NLTK使用上下文无关的解析器。 如果需要鲁棒性和覆盖范围广,请使用统计分析器。 回答2 有各种Web服务可提供自动校对和语法检查。 有些具有Python库来简化查询。 据我所知,大多数这些工具(肯定是在Deadline和LanguageTool之后)都是基于规则的。
  • 如何在Java中的字符串中找到整个单词(How to find a whole word in a String in java)
    问题 我有一个字符串,必须针对不同的关键字进行解析。 例如,我有字符串: “我将在123woods与您会面” 我的关键字是 '123woods''woods' 每当有比赛和地点时,我都应报告。 也应考虑多次出现。 但是,对于这个,我应该只在123woods上进行比赛,而不是在woods上进行比赛。 这消除了使用String.contains()方法。 另外,我应该能够有一组关键字列表/关键字,并同时检查它们的出现。 在此示例中,如果我有“ 123woods”和“ come”,则应该出现两次。 在大型文本上,方法执行应该会比较快。 我的想法是使用StringTokenizer,但是我不确定它是否会运行良好。 有什么建议? 回答1 下面的示例基于您的评论。 它使用关键字列表,它将使用单词边界在给定的字符串中进行搜索。 它使用来自Apache Commons Lang的StringUtils构建正则表达式并打印匹配的组。 String text = "I will come and meet you at the woods 123woods and all the woods"; List<String> tokens = new ArrayList<String>(); tokens.add("123woods"); tokens.add("woods"); String
  • 正则表达式仅匹配大写“单词”,但有一些例外(Regex to match only uppercase “words” with some exceptions)
    问题 我有以下技术字符串: "The thing P1 must connect to the J236 thing in the Foo position." 我想用一个正则表达式匹配那些仅在大写的单词(即在这里P1和J236 )。 问题是,当它是一个字母的单词时,我不想匹配句子的第一个字母。 例如,在: "A thing P1 must connect ..." 我只想要P1 ,而不想要A和P1 。 通过这样做,我知道我可以错过一个真实的“单词”(例如"X must connect to Y" ),但是我可以忍受它。 另外,如果句子全为大写,我不想匹配大写单词。 例子: "THING P1 MUST CONNECT TO X2." 当然,理想情况下,我想在此处匹配技术用语P1和X2 ,但由于它们在全大写句子中是“隐藏的”,并且由于这些技术用语没有特定的模式,因此这是不可能的。 同样,我可以忍受它,因为在我的文件中,全大写的句子不是那么频繁。 谢谢! 回答1 在某种程度上,这将因您使用的RegEx的“风味”而异。 以下内容基于.NET RegEx,它使用\b表示单词边界。 在上一个示例中,它还使用负的环视(?<!)和(?!)以及非捕获括号(?:) 但是,基本上,如果术语始终包含至少一个大写字母,然后至少包含一个数字,则可以使用 \b[A-Z]+[0-9]+\b 对于全部大写和数字
  • 检查句子是否包含 PHP 中的单词(Checking if sentence contains a word in PHP)
    问题 如何检查一个句子是否包含一个单词。 我明确地使用了名称句子和单词而不是字符串和子字符串。 例如:对于句子 $s = "Ala makota, a kot ma przesrane"; 调用函数 checkIfContains("kota",$s) 返回假。 但对于 checkIfContains("makota",$s) 返回真。 回答1 如果您只想匹配完整的单词,则需要一个正则表达式来完成此操作。 请尝试以下操作: <?php function checkIfContains( $needle, $haystack ) { return preg_match( '#\b' . preg_quote( $needle, '#' ) . '\b#i', $haystack ) !== 0; } 回答2 你需要strpos。 if (strpos($s, 'kota') !== false) { } 或者如果你坚持.. function checkIfContains($needle, $haystack) { return (strpos($haystack, $needle) !== false); } 对于完整的话,您可以考虑使用正则表达式: if (preg_match('/\bkota\b/i', $s)) { } 回答3 我会使用 expand
  • 如何在PHP中获得句子的第一个单词?(How to get the first word of a sentence in PHP?)
    问题 我想从字符串中提取变量的第一个单词。 例如,输入以下内容: <?php $myvalue = 'Test me more'; ?> 结果输出应为Test ,这是输入的第一个单词。 我怎样才能做到这一点? 回答1 您可以使用爆炸功能,如下所示: $myvalue = 'Test me more'; $arr = explode(' ',trim($myvalue)); echo $arr[0]; // will print Test 回答2 有一个字符串函数(strtok),可用于根据某些分隔符将字符串拆分为较小的字符串(标记)。 出于该线程的目的,可以通过在空格字符上标记字符串来获得Test me more的第一个单词(定义为第一个空格字符之前的任何内容)。 <?php $value = "Test me more"; echo strtok($value, " "); // Test ?> 有关更多详细信息和示例,请参见strtok PHP手册页。 回答3 如果您有PHP 5.3 $myvalue = 'Test me more'; echo strstr($myvalue, ' ', true); 请注意,如果$myvalue是一个只有一个单词strstr的字符串,在这种情况下不会返回任何内容。 一种解决方案是在测试字符串后添加一个空格: echo strstr(
  • 如何将字符串拆分为单词。 例如:“ stringintowords”->“将字符串转换成单词”?(How to split a string into words. Ex: “stringintowords” -> “String Into Words”?)
    问题 将字符串拆分为单词的正确方法是什么? (字符串不包含任何空格或标点符号) 例如:“ stringintowords”->“ String into Words” 您能否建议在这里使用哪种算法? ! 更新:对于那些认为这个问题只是出于好奇的人。 该算法可用于区分域名(“ sportandfishing.com”->“ SportAndFishing.com”),并且aboutus dot org当前使用此算法来动态进行此转换。 回答1 正如许多人在这里提到的那样,这是一个标准的,易于动态编程的问题:FalkHüffner提供了最佳的解决方案。 虽然附加信息: (a)您应该考虑使用trie实现isWord ,如果使用得当(即通过逐步测试单词),这将为您节省大量时间。 (b)输入“分段动态编程”会产生更多更详细的答案,例如使用伪代码算法的大学级讲座,例如杜克大学的讲座(甚至提供了一种简单的概率方法来处理什么)当您有任何词典中都不会包含的单词时执行此操作)。 回答2 假设您有一个函数isWord(w) ,该函数使用字典检查w是否是单词。 为简单起见,让我们现在还假设您只想知道对于某些单词w ,是否可以进行拆分。 这可以通过动态编程轻松完成。 令S[1..length(w)]为带有布尔条目的表。 如果可以拆分单词w[1..i]则S[i]为true。 然后设置S[1] = isWord
  • 如何在C#中使用Regex将短语分解为单词(How do I split a phrase into words using Regex in C#)
    问题 我正在尝试使用正则表达式将句子/短语拆分为单词。 var phrase = "This isn't a test."; var words = Regex.Split(phrase, @"\W+").ToList(); 单词包含“This”、“isn”、“t”、“a”、“test” 显然,它正在选择撇号并对其进行拆分。 我可以改变这种行为吗? 它还需要使用多种语言来支持多种语言(西班牙语,法语,俄语,韩语等)。 我需要将单词传递给拼写检查器。 特别是Nhunspell。 return (from word in words let correct = _engine[langId].Spell(word) where !correct select word).ToList(); 回答1 如果您想拆分成单词以进行拼写检查,这是一个很好的解决方案: new Regex(@"[^\p{L}]*\p{Z}[^\p{L}]*") 基本上你可以使用之前的正则表达式来使用 Regex.Split。 它使用 unicode 语法,因此可以在多种语言中使用(但不适用于大多数亚洲人)。 并且它不会破坏带有撇号或连字符的单词。 回答2 使用Split() 。 words = phrase.Split(' '); 没有标点符号。 words = phrase.Split(new Char [] {
  • 一文汇总SCI常用套路,工具和词汇,帮你轻松搞定SCI写作!
    如何写出一流的SCI论文?SCI的文章写作,向来是比较头疼的问题。第一次发表论文就像一个里程碑,发表论文是建立成功职业生涯的关键一步。那么,一系列的实验是如何演变成一篇科学论文的呢?1内功篇对于一篇好的论文而言,标题、摘要、数据和结果都至关重要。对于那些母语不是英语的研究人员而言,科学论文不仅是分享研究结果和研究方法,把论文写成故事或许能让你的论文脱颖而出。关于发文本身神经学家Agustin Ibanez回忆起第一次发论文时的场景:那时候,我没有任何出版经验,我的导师也没有任何经验。所以我的第一篇论文至少被拒绝了八次,但是在这个过程中我学到了——虽然很痛苦,但是可以有机会从评审那里得到持续的反馈和建议,也就有了更多的机会和经验来改进自己的写作方法。对刚上路的研究人员来说,发表论文的压力可能非常大。不幸的是,这种压力普遍存在在学术界。你必须发表。一整年没有发表任何东西不是一件好事。评判科研人员的标准就是看发文水平,论文写得好不好就是在给工作打分。Dixon Chibanda作为一名临床医生,也作为一名研究人员。他认为研究的目的很重要:有些研究人员致力于发表研究成果,有些研究人员致力于把研究成果推广到世界各地时。所以,每位作者都有自己不同的关注点,没有对错之分。这取决于你自己的感觉,作为一个项目的研究者——你的研究目的究竟是什么?其实,做研究是一个工作的过程包括:一些分析,一些实验
  • 如何检查给定的字符串是否是单词(How to check whether given string is a word)
    问题 您好,我正在开发一个文字游戏,我想检查用户输入是否为有效单词,请建议我可以在android中检查给定字符串的方式。 例如。 字符串s =“ asfdaf”我要检查其是否有效。 回答1 有许多可能的解决方案,以下是一些 使用网络字典API https://developer.oxforddictionaries.com/ http://googlesystem.blogspot.com/2009/12/on-googles-unofficial-dictionary-api.html http://www.dictionaryapi.com/ 如果您希望使用本地解决方案 import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; class WordChecker { public static boolean check_for_word(String word) { // System.out.println(word); try { BufferedReader in = new BufferedReader(new FileReader( "/usr/share/dict/american-english")); String str; while ((str
  • 知识图谱:一种从文本中挖掘信息的强大数据科学技术
    概览 知识图谱是数据科学中最有趣的概念之一了解如何使用Wikipedia页面上的文本构建知识图谱我们将动手使用Python流行的spaCy库构建我们的知识图谱 介绍 梅西(Lionel Messi)无需介绍,甚至不喜欢足球的人都听说过,最伟大的球员之一为这项运动增光添彩。这是他的维基百科页面: 那里有很多信息!我们有文本,大量的超链接,甚至还有音频剪辑。在一个页面上有很多相关且可能有用的信息。 但是,有一个小问题。这不是要馈送到我们的计算机的理想数据源。无论如何都不是当前形式。 我们能否找到一种方法使该文本数据对计算机可读?从本质上讲,我们可以将这些文本数据转换为机器可以使用的内容,也可以由我们轻松地解释吗? 我们可以!我们可以借助知识图谱(KG)来做到这一点,KG是数据科学中最引人入胜的概念之一。知识图谱的巨大潜力和应用使我震惊,并且我相信你也会如此。 在本文中,你将了解什么是知识图谱,它们为何有用,然后我们将基于从Wikipedia提取的数据构建自己的知识图谱,从而深入研究代码。 什么是知识图谱? 让我们先确定一件事情,在本文中,我们会经常看到图一词。当我说图时,我们并不是指条形图,饼图和折线图。在这里,我们谈论的是相互联系的实体,这些实体可以是人员,位置,组织,甚至是事件。 我们可以将图定义为一组节点和边。看下图: 这里的节点A和节点B是两个不同的实体
  • 来自文件python的单词分析和评分(word analysis and scoring from a file python)
    问题 我正在对一个句子进行逐字分析,例如 “嘿!这是一部很棒的电影???” 我有很多像上面这样的句子。 我有一个巨大的数据集文件,如下所示,如果该词存在,我必须快速查找。 如果是,则进行分析并存储在字典中,例如从单词的文件中获取分数,句子的最后一个单词的分数,句子的第一个单词的分数等等。 句子[i] => 嘿! 这是一部优秀的电影??? 句子[0] = 嘿,句子[1]=那里!! 句子[2]=这个等等。 这是代码: def unigrams_nrc(file): for line in file: (term,score,numPos,numNeg) = re.split("\t", line.strip()) if re.match(sentence[i],term.lower()): #presence or absence of unigrams of a target term wordanalysis["unigram"] = found else: found = False if found: wordanalysis["trail_unigram"] = found if re.match(sentence[(len(sentence)-1)],term.lower()) else not(found) wordanalysis["lead_unigram"] =
  • 如何反转字符串中的每个单词,但以相同的句子顺序? [复制](How do I reverse each word in a string, but in the same sentence order? [duplicate])
    问题 这个问题在这里已经有了答案: 反转字符串中的每个单词(8 个答案) 4年前关闭。 我试过这样做 while 1: line = input('Line: ') print(line[::-1]) 但所做的只是颠倒了整个句子,我想知道是否有人可以帮助我编写一个将“hello world”转换为“olleh dlrow”而不是“dlrow olleh”的程序,以及如何在输入什么都没有,还是只是一个空格? 先谢谢了! 回答1 您需要拆分句子,颠倒单词,然后重新组合。 最简单的拆分方法是在空格上进行拆分,使用str.split() ; 重新组装只是用空格重新连接反向单词的一种情况: ' '.join([word[::-1] for word in line.split()]) 演示: >>> line = 'hello world' >>> ' '.join([word[::-1] for word in line.split()]) 'olleh dlrow'
  • 【项目小结】英语语法错误检测(GEC)开题论文阅读记录
    毕业论文准备尝试一下GEC,虽然没有过这方面的经验,但做老生常谈的课题实在是亏待宝贵的最后一年。其实最主要的原因是莫名奇妙被一个从来没上过课的教授加微信翻了牌子,我看了一下他给出的题目:英语句法分析、英语用词错误检测,文本摘要、文本阅读理解,还有一个乱入的野生动物识别,我自己觉得很有兴趣也非常具有挑战性,他让我自己选一个,我觉得后面三个思路相对单纯一些,可能就是seq2seq的模型和图片识别的问题;前两个似乎比较有趣一些(也许之后我就不这么觉得了...),便脑子一热选了句法分析检测。 但毕竟这块白板一块,所以做个综述草稿,主要是记录文献阅读的总结。 20191029 英语学习者书面语法错误自动检测研究综述_刘磊(2018.1) 1. 第一代GEC系统:采用简单的字符串匹配和替换识别、修改错误(Writer's Workbench) 第二代GEC系统:人工编纂的语法规则对文本进行句法分析(Epistle, Critique, MS Office) 第三代GEC系统:从大规模本族语或学习者语料库中提取词汇-句法特征,通过机器学习算法自动构建统计模型检测语法错误,如微软公司开发的ESL Assistant系统; 2. 学习者语料库:UICLE FCE Lang-8 NUCLE 3. 本族语者语料库:BNC Gigaword Wikipedia 4. 常用方法: > N元语法模型(N
  • 如何在python中的字符串中检查确切的单词(How do I check for an EXACT word in a string in python)
    问题 基本上,我需要找到一种方法来找出在字符串中找到确切单词的方法。 我在网上阅读的所有信息仅给了我如何搜索字符串中的字母的信息,因此 98787这是正确的 在if语句中仍然会返回true。 到目前为止,这就是我所拥有的。 elif 'This is correct' in text: print("correct") 这将与“正确”之前的任何字母组合一起工作。例如,fkrjCorrect,4123Correct和lolcorrect将在if语句中全部恢复为true。 当我希望仅当它完全匹配“这是正确的”时才返回为真 回答1 您可以使用正则表达式的单词边界。 例子: import re s = '98787This is correct' for words in ['This is correct', 'This', 'is', 'correct']: if re.search(r'\b' + words + r'\b', s): print('{0} found'.format(words)) 产生: is found correct found 编辑:对于完全匹配,请将\b断言替换为^和$以将匹配限制为行的开头和结尾。 回答2 使用比较运算符==代替in : if text == 'This is correct': print("Correct")
  • 查找前10个搜索词的算法(Algorithm to find top 10 search terms)
    问题 我目前正在准备面试,它使我想起了上次面试中曾经被问到过的一个问题,该问题是这样的: “已经要求您设计一些软件来连续显示Google上排名前10位的搜索词。您可以访问Feed,该Feed提供了当前在Google上搜索的无穷实时搜索词源。您将用来实现此目的。您将设计两个变体: (i)显示所有时间(即自您开始阅读提要以来)的前10个搜索词。 (ii)仅显示过去一个月的前10个搜索字词,每小时更新一次。 您可以使用近似值来获得前十名的列表,但是您必须证明自己的选择是正确的。” 我在这次采访中遭到轰炸,但实际上仍然不知道如何实施。 第一部分要求在无限列表的不断增长的子序列中提供10个最频繁出现的项目。 我研究了选择算法,但找不到任何在线版本来解决此问题。 第二部分使用有限列表,但是由于要处理大量数据,您无法真正将整个月的搜索字词存储在内存中,也无法每小时计算一次直方图。 前十名列表不断更新的事实使问题变得更加棘手,因此您需要以某种方式在滑动窗口上计算前十名。 有任何想法吗? 回答1 好吧,看起来数据量很大,存储所有频率的成本可能过高。 当数据量太大以至于我们不能希望全部存储时,我们进入数据流算法的领域。 该领域的有用书籍:Muthukrishnan-“数据流:算法和应用程序” 我从上文中选择的与手头问题密切相关的参考资料:Mokuani的Manku-“数据流上的近似频率计数” [pdf
  • 如何在python中制作匿名器?(How to make anonymizer in python?)
    问题 我正在开发一个匿名程序,它可以检测列表中给定的单词。 这是我到目前为止。 我是 python 的新手,所以不知道如何实现这一点。 def isAlpha(c): if( c >= 'A' and c <='Z' or c >= 'a' and c <='z' or c >= '0' and c <='9'): return True else: return False def main(): message = [] userInput = str(input("Enter The Sentense: ")) truncatedInput = userInput[:140] for i in range(len(truncatedInput)): if(truncatedInput[i] == 'DRAT'): truncatedInput[i] = 'x' print(truncatedInput[i]) 这是我得到的输出 Enter The Sentense: DRAT D R A T 我想把这个词换成XXXX 回答1 您的代码有几个问题: 已经存在一个islpha函数; 它是一个str方法(见下面的例子)。 您的trucatedInput是str ,它是一种不可变类型。 您不能重新分配不可变类型的部分; 即myStr[3]='x'通常会失败。 如果您真的想这样做
  • 如何使用Gensim的word2vec模型和python计算句子相似度(How to calculate the sentence similarity using word2vec model of gensim with python)
    问题 根据Gensim Word2Vec,我可以使用gensim包中的word2vec模型来计算2个单词之间的相似度。 例如 trained_model.similarity('woman', 'man') 0.73723527 但是,word2vec模型无法预测句子相似度。 我在gensim中发现了具有句子相似性的LSI模型,但是,似乎无法将它与word2vec模型结合使用。 我拥有的每个句子的语料库长度不是很长(少于10个字)。 那么,有没有简单的方法可以达到目标呢? 回答1 这实际上是您要问的一个非常具有挑战性的问题。 计算句子相似度需要建立句子的语法模型,了解等同的结构(例如“昨天他去商店”和“昨天他去商店”),不仅要在代词和动词中找到相似性,还要在句子中找到相似性。专有名词,在许多真实的文字示例中找到统计共现/关系,等等。 您可以尝试的最简单的方法-尽管我不知道这样做的效果如何,并且肯定不会给您带来最佳效果-首先,请删除所有“停止”字词(例如“ the”,“ an”等等),然后对两个句子中的单词运行word2vec,将一个句子中的向量求和,将另一个句子中的向量求和,然后找出两者之间的区别总和。 通过对它们进行汇总,而不是逐字逐句地进行区别,您至少不会受到词序的限制。 话虽这么说,这将以多种方式失败,而且无论如何都不是一个好的解决方案
  • 将句子拆分成单独的单词(Split a sentence into separate words)
    问题 我需要将中文句子拆分为单独的单词。 中文的问题是没有空格。 例如,该句子可能看起来像:主楼怎么走(带空格的是:主楼 怎么 走)。 目前,我可以想到一种解决方案。 我有一本带有中文单词的字典(在数据库中)。 该脚本将: 尝试在数据库(主楼)中找到句子的前两个字符, 如果主楼实际上是一个单词,并且在数据库中,脚本将尝试查找前三个字符(主楼怎)。主楼怎是单词,因此不在数据库中=>我的应用程序现在知道主楼是一个单独的单词。 尝试用其余的角色来做。 我不太喜欢这种方法,因为即使分析很小的文本,它也会查询数据库太多次。 还有其他解决方案吗? 回答1 感谢大家的帮助! 经过一番研究后,我发现了一些工作工具(牢记您的所有建议),这就是为什么我要回答自己的问题。 一个PHP类(http://www.phpclasses.org/browse/package/2431.html) Drupal模块,基本上是另一个具有4种不同细分算法的PHP解决方案(非常容易理解它的工作原理)(http://drupal.org/project/csplitter) 用于中文分词的PHP扩展(http://code.google.com/p/phpcws/) 如果您尝试在baidu.com上搜索“中文分词”,则还有其他解决方案 真挚地, qu 回答2 您可能要考虑使用trie数据结构。 您首先要从字典中构造特里